读取分隔符文本文件?

5
我将尝试读取分隔文本文件,但所有数据都会返回为一个行和一列。
我的连接字符串是:
OleDbConnection con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
    Path.GetDirectoryName(@textBox1txtPath.Text) + ";" + 
    "Extended Properties=\"text;HDR=YES;IMEX=1;Format=Delimited(|)\"");

我的文本文件内容如下:

ItemNumber|ProductStatus|UPC
0000012|closed|2525

Please assist


请查看 FileHelpers nuget 包。该库的文档在这里。使用该库可以轻松解析分隔符文件。 - David Brabant
3个回答

4
我不知道你确切需要什么,但是你可以这样做:
如果你有一个名为string str的字符串,其中包含整篇文章,你可以这样做:
string[] lines = str.Split('\n');// split it to lines;

然后,对于每一行,您可以执行以下操作

string[] cells = line.Split('|');// split a line to cells

如果我们把它提升到下一个级别,我们可以做到:
public class line
{
  public int ItemNumber { get; set; }
  public string ProductStatus { get; set; }
  public int UPC { get; set; }

  public line(string currLine)
  {
     string[] cells = currLine.Split('|');
     int item;
     if(int.TryParse(cells[0], out item))
     {
        ItemNumber = item;
     }

     ProductStatus = cells[1];

     int upc;
     if (int.TryParse(cells[2], out upc))
     {
        UPC = upc;
     }
  }
}

然后:

string[] lines = str.Substring(str.IndexOf("\n")).Split('\n');// split it to lines;
List<line> tblLines = new List<line>();

foreach(string curr in lines)
{
    tblLines.Add(new line(curr);
}

4

好的,那么一个选择是采取不同的方法。考虑以下代码:

// read the entire file and store each line
// as a new element in a string[]
var lines = File.ReadAllLines(pathToFile);

// we can skip the first line because it's
// just headings - if you need the headings
// just grab them off the 0 index
for (int i = 1; i < lines.Length; i++)
{
    var vals = lines[i].Split('|');

    // do something with the vals because
    // they are now in a zero-based array
}

这样可以摆脱那个丑陋的连接字符串,消除 Odbc 驱动程序的开销,并大大提高代码的可读性。

我终于说服了它: RegistryKey myKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft\Jet\4.0\Engines\Text", true); myKey.SetValue("Format", "Delimited(|)", RegistryValueKind.String); - user2686400

3

这个框架就在这里 -- TextFieldParser。不用担心命名空间,它最初是为从VB6转换过来的人准备的,但非常有用。下面是一个SSCCE,演示了它如何处理多种分隔符:

class Program
{
    static void Main(string[] args)
    {
        var comma = @"one,""two, yo"",three";
        var tab = "one\ttwo, yo\tthee";
        var random = @"onelol""two, yo""lolthree";

        var parser = CreateParser(comma, ",");
        Console.WriteLine("Parsing " + comma);
        Dump(parser);
        Console.WriteLine();
        parser = CreateParser(tab, "\t");
        Console.WriteLine("Parsing " + tab);
        Dump(parser);
        Console.WriteLine();
        parser = CreateParser(random, "lol");
        Console.WriteLine("Parsing " + random);
        Dump(parser);
        Console.WriteLine();
        Console.ReadLine();
    }

    private static TextFieldParser CreateParser(string value, params string[] delims)
    {
        var parser = new Microsoft.VisualBasic.FileIO.TextFieldParser(ToStream(value));
        parser.Delimiters = delims;
        return parser;
    }

    private static void Dump(TextFieldParser parser)
    {
        while (!parser.EndOfData)
            foreach (var field in parser.ReadFields())
                Console.WriteLine(field);
    }

    static Stream ToStream(string value)
    {
        return new MemoryStream(Encoding.Default.GetBytes(value));
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接