推荐的方法来读取文本文件中的某些内容

问题描述 投票:0回答:3

我试图找出从文件中读取数据的最佳方法。我想出了一个方法,但作为一个小。我知道这不是最好的办法。这是我的文本文件的样子:

--------Text File text.txt---------
username: nothingeag
accesscode: 123456
value: 74
email: [email protected]
--------End of File----------------

这就是我想出的:

using System;
using System.IO;
using System.Linq;

namespace FileSystem
{
    class Program
    {
        static void Main(string[] args)
        {
            var username = "";
            var accesscodeStr = "";
            var accesscode = 0;
            var valueStr = "";
            var value = 0;
            var email = "";
            var path = @"C:\Users\jthompson\text.txt";

            //Read Lines
            username = File.ReadLines(path).Skip(0).Take(1).First();
            accesscodeStr = File.ReadLines(path).Skip(1).Take(1).First();
            valueStr = File.ReadLines(path).Skip(2).Take(1).First();
            email = File.ReadLines(path).Skip(3).Take(1).First();

            //Trim retrieved data
            username = username.Substring(10);
            accesscodeStr = accesscodeStr.Substring(12);
            valueStr = valueStr.Substring(7);
            email = email.Substring(7);

            //Parse the INT values
            accesscode = Int32.Parse(accesscodeStr);
            value = Int32.Parse(valueStr);

            //Display the Data
            Console.WriteLine(accesscode);
            Console.WriteLine(email);
            Console.WriteLine(username);
            Console.WriteLine(value);
        }
    }
}

这完全符合我的需要:

123456
[email protected]
nothingeag
74

在文本文件中阅读这样的特定项目的最佳方法是什么?

c# .net
3个回答
1
投票

如果输入文件结构是静态的,则意味着它不会改变顺序;您可以使用下面的代码而不是// ReadLines代码。

        var allLines = File.ReadAllLines(path);
        var dataSet = allLines.Select(line => line.Trim().Split(' ')[1]).ToArray();
        // Add conditional checks regarding the length of the dataset and any thing else.
        var userName = dataSet[0];
        var accesscode = Convert.ToInt32(dataSet[1]);
        var value = Convert.ToInt32(dataSet[2]);
        var email = dataSet[3];

        // Then your console.writeline statements here.

如果您不确定订单,可以使用字典存储行拆分的两个部分,其中一个用于键,另一个用于存储值。然后打印出来。


2
投票

好吧,你犯了很多错误:

  • 您正在通过该文件枚举多次。读取它,存储它,而不是对存储的数据进行操作。
  • 不要使用硬编码的子串,而是使用string.Split。
  • 没有什么可以向您保证这些数据是您所期望的。这个数字很可能是一个字符串,而不是你的程序会崩溃。

以下是上层思想的简单实现:

string[] fileInput = File.ReadAllLines(path);

string usernameString = fileInput[0].Split(": ")[1];
string accessCodeString = fileInput[1].Split(": ")[1];
string valueString = fileInput[2].Split(": ")[1];
string emailString = fileInput[3].Split(": ")[1];

int accessCode;    
if (!int.TryParse(accessCodeString, out accessCode))
{
     //Do something when accesscode is not int.
}

int value;    
if (!int.TryParse(accessCodeString, out value))
{
     //Do something when value is not int.
}

Console.WriteLine(accesscode);
Console.WriteLine(emailString);
Console.WriteLine(usernameString);
Console.WriteLine(value);

这不是一个完美的解决方案,但它是在正确的方向。


-2
投票

我知道这看起来有点傻,但Microsoft.VisualBasic程序集有一些很好的资源来读取文本文件。这真的很快而且很脏。我只是使用':'作为其他人建议的分隔符。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualBasic;

namespace SandBox
{
    class Program
    {

        static void Main(string[] args)
        {
            List<string> outputStrings = new List<string>();
            string path = @"C:\Users\oa971d\Desktop\textSample.txt";

            using (Microsoft.VisualBasic.FileIO.TextFieldParser parser =
                new Microsoft.VisualBasic.FileIO.TextFieldParser(path))
            {
                parser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
                parser.SetDelimiters(":"); //.csv
                                           //parser.SetDelimiters("\t"); //tab delimited .txt

              while(!parser.EndOfData)
                {
                    string[] fields = parser.ReadFields();
                    if(fields.Length>1)
                        outputStrings.Add(fields[1]);
                }        
            }
            foreach(string s in outputStrings)
            { Console.WriteLine(s); }
            Console.ReadLine();
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.