0

我正在尝试读取一个由管道分隔的充满医疗记录的文本文件。大约有 20 列数据和数百万行。文本文件的大小约为 1GB。

第一步是读取数据。这是我的代码:

private void button1_Click(object sender, EventArgs e)
    {
        string strFilePath = @"abcrecords.txt";
        string[,] myArray;

        using (FileStream fs = new FileStream(strFilePath, FileMode.Open))
        using (StreamReader rdr = new StreamReader(fs))
        {
            while (!rdr.EndOfStream)
            {
                string[] strFileLine = rdr.ReadLine().Split('|');
                {
                    myArray = strFileLine;
                }
            }
        }
    }

如何将分割线(有 20 个元素)的结果放入myArray. 然后将每个新的分割线添加到myArray?现在,我收到错误:

错误无法将类型“string[]”隐式转换为“string[ , ]”

4

3 回答 3

1

List<string[]>如果要修改它,请改用 a ,数组是不可变的。您还可以使用File.ReadLines更舒适的StreamReader(恕我直言):

List<string[]> allLines = File.ReadLines(path)
    .Select(l => l.Split('|').ToArray())
    .ToList();

请注意,上面是一个 Linq 查询,需要添加using System.Linq.

关于我的方法的内存消耗的最后说明。File.ReadLines使用 a StreamReaderunder the hood 一次读取一行,这与一次File.ReadAllLines将所有内容读入内存不同,但您还可以进一步改进这种方法:

看看我自己的相关问题:High memory consumption with Enumerable.Range?

因此,您可以先读取行数以使用正确的大小初始化列表:

int count = File.ReadLines(path).Count();
var allLines = new List<string[]>(count);
var lines = File.ReadLines(path).Select(l => l.Split('|').ToArray());
allLines.AddRange(lines);

否则,由于从List.Add.

但是你真的应该考虑改用数据库。

于 2013-01-11T17:21:10.030 回答
1

尝试这个:

        File.ReadAllLines("abcrecords.txt").Select(x => x.Split('|')).ToArray();

更新

因为文件很大,您可以使用:

        var result = new List<string[]>();
        using (FileStream fs = new FileStream(strFilePath, FileMode.Open))
        using (StreamReader rdr = new StreamReader(fs))
        {
            while (!rdr.EndOfStream)
            {
                result.Add(rdr.ReadLine().Split('|')))
            }
        }

但是将这么大的对象存储在内存中会非常昂贵。

于 2013-01-11T17:21:41.740 回答
0

借用了 Alexander Balte 的开头。

using (FileStream fs = new FileStream("", FileMode.Open))
{
  using (StreamReader rdr = new StreamReader(fs))
  {
    while (!rdr.EndOfStream)
    {
      DoSomethingWith(rdr.ReadLine().Split('|')));
    }
  }
}
void DoSomethingWith(String[] argColumns)
{
  // on y va
}
于 2013-01-11T17:49:36.773 回答