0

使用 C# (VS 2010 Express) 我将文本文件的内容读入字符串。该字符串相当长,但可靠地被“\t”(用于制表符)和“\r\n”(用于回车/换行符)分解。

选项卡表示新的数据列,新行表示新的数据行。

我想创建一个数组或维度列表 (X)(Y),这样数组中的每个点都可以保存文本文件中的 1 行数据,以及该 1 行中包含的所有 Y 列(“\t”表示新的数据列,“\r\n”表示新的数据行”)。

为了简单起见,假设我的文本有 10 行数据和 2 列。我想创建一个数组或列表或您认为最适合存储数据的任何内容。我该怎么做呢?谢谢。

这是我用来将文本文件中的数据读入字符串的代码:

// Read the file as one string.
            System.IO.StreamReader myFile = new System.IO.StreamReader("f:\\data.txt");
            string myString = myFile.ReadToEnd();
4

6 回答 6

1
var result = contents.Split("\r\n".ToArray(), StringSplitOptions.RemoveEmptyEntries).Select(s => {
    s.Split('\t').ToList();
}).ToList();

result将是一个List<List<String>>.

于 2012-08-29T19:34:30.453 回答
1

字符串拆分

http://msdn.microsoft.com/en-us/library/system.string.split.aspx

于 2012-08-29T19:34:40.267 回答
1
File.ReadLines(sourceFilePath)
    .Select(line => line.Split('\t'))
    .ToArray();
于 2012-08-29T19:36:12.520 回答
1

这将读取文件并为您创建一个字符串数组列表

List<string[]> rows= File.ReadLines("PathToFile")
    .Select(line=>line.Split('\t')).ToList();

如果您想要string[][]版本,只需在末尾使用ToArray();而不是。ToList();

于 2012-08-29T19:36:16.583 回答
1

TextFieldParser是处理基于文本的分隔文件的一个很棒的类。您可以为它提供一个文件、一个分隔符(在本例中为“\t”),它将提供一种获取下一行值的方法(作为字符串数组)。

它比一般情况下的简单情况具有优势,Split因为它可以处理注释、引用字段、转义分隔符等。您可能有也可能没有这种情况,但是几乎免费处理所有这些尴尬的边缘情况是相当不错的。

于 2012-08-29T19:39:01.990 回答
1

就像原样(你已经有了一个包含所有内容的字符串):

str.Split(new string[]{"\r\n"}, StringSplitOptions.None)
  .Select(s => s.Split('\t'));

为您提供一个IEnumerable<string[]>生产变量,如列表列表、数组数组等,只需要合适的ToArray()ToList()等。

但是,如果您可以一次处理每一行,则可以使用一些可以让您这样做的东西会更好:

public IEnumerable<string[]> ReadTSV(TextReader tr)
{
  using(tr)
    for(string line = tr.ReadLine(); line != null; line = tr.ReadLine())
      yield return line.Split('\t');
}

然后,您只使用每行所需的内存。我们可以更进一步,将读取更改为一次发出每个单独的单元格,但这通常足以以合理的效率读取数百 MB 大小的文件。

根据对问题的评论进行编辑:

如果你真的想,你可以List<string[]>从:

var myFile = new StreamReader("f:\\data.txt");
var list = ReadTSV(myFile).ToList();

或者,将行更改yield return line.Split('\t');yield return line.Split('\t');,您会得到一个List<List<string>>.

但是,如果可能的话,直接处理结果,而不是先将其放入列表中:

var myFile = new StreamReader("f:\\data.txt");
var chunks = ReadTSV(myFile);
foreach(var chunk in chunks)
{
   DoSometingOnAChunk(chunk[0], chunk[1]);
}

它将使用更少的内存,并且可以更快地开始,而不是先暂停阅读整个内容。像这样的代码可以毫无怨言地愉快地运行千兆字节。

于 2012-08-29T19:39:54.903 回答