使用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();
答案 0 :(得分:1)
var result = contents.Split("\r\n".ToArray(), StringSplitOptions.RemoveEmptyEntries).Select(s => {
s.Split('\t').ToList();
}).ToList();
result
将是List<List<String>>
。
答案 1 :(得分:1)
答案 2 :(得分:1)
File.ReadLines(sourceFilePath)
.Select(line => line.Split('\t'))
.ToArray();
答案 3 :(得分:1)
这将读取文件并为您创建字符串数组列表
List<string[]> rows= File.ReadLines("PathToFile")
.Select(line=>line.Split('\t')).ToList();
如果您想要string[][]
版本,最后只需使用ToArray();
代替ToList();
。
答案 4 :(得分:1)
TextFieldParser是处理基于文本的分隔文件的绝佳类。你可以提供一个文件,一个分隔符(在本例中为“\ t”),它将提供一个获取下一行值的方法(作为一个字符串数组)。
它在一般情况下优于简单Split
,因为它可以处理注释,引用字段,转义分隔符等。您可能有也可能没有这种情况,但处理了所有这些尴尬的边缘情况几乎免费是相当不错的。
答案 5 :(得分:1)
就是这样(你已经有一个包含所有东西的字符串):
str.Split(new string[]{"\r\n"}, StringSplitOptions.None)
.Select(s => s.Split('\t'));
为您提供IEnumerable<string[]>
生成variantes,如列表列表,数组数组等,只需要合适的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的文件,效率合理。
根据对问题的评论进行修改:
如果你真的想,你可以从{<1}}获得:{/ p>
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>>
它将使用更少的内存,并且更快地开始而不是暂停以首先阅读整个事物。像这样的代码可以毫无怨言地快速通过千兆字节。