如何在C#中将字符串分解为数组(或列表)?

如何在C#中将字符串分解为数组(或列表)?,c#,arrays,list,C#,Arrays,List,我使用C#(VS 2010 Express)将文本文件的内容读入字符串。字符串相当长,但对于制表符用“\t”分隔,对于回车/换行符用“\r\n”分隔 选项卡表示新的数据列,新行表示新的数据行 我想创建一个数组或维度列表(X)(Y),这样数组中的每个点都可以保存文本文件中的一行数据,并且该行中包含的所有Y列(“\t”表示新的数据列,“\r\n”表示新的数据行”) 为了简单起见,假设我的文本有10行数据和2列。我想创建一个数组或列表或任何你认为最适合存储数据的东西。我该怎么做?谢谢 这是我用来将文本

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

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

我想创建一个数组或维度列表(X)(Y),这样数组中的每个点都可以保存文本文件中的一行数据,并且该行中包含的所有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();
结果
将是一个
列表

结果
将是一个
列表

字符串

String.Split


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

List<string[]> rows= File.ReadLines("PathToFile")
    .Select(line=>line.Split('\t')).ToList();
List rows=File.ReadLines(“路径文件”)
.Select(line=>line.Split('\t')).ToList();

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

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

List<string[]> rows= File.ReadLines("PathToFile")
    .Select(line=>line.Split('\t')).ToList();
List rows=File.ReadLines(“路径文件”)
.Select(line=>line.Split('\t')).ToList();
如果您想要
string[][]
版本,只需使用
ToArray();
而不是在末尾使用
ToList();

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

在一般情况下,它比简单的
拆分
更具优势,因为它可以处理注释、带引号的字段、转义定界符等。您可能有也可能没有此类情况,但让所有这些尴尬的边缘情况几乎免费处理是相当不错的。

对于处理基于文本的定界符文件来说,这是一个非常好的类为它提供一个文件、一个分隔符(在本例中为“\t”),它将提供一个方法来获取下一行值(作为字符串数组)

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

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

提供一个
IEnumerable
生成变量,如列表列表、数组数组等,只需要合适的
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');
}
或者,将行
yield return line.Split('\t');
更改为
yield return line.Split('\t');
,您将得到一个
列表

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

var myFile = new StreamReader("f:\\data.txt");
var chunks = ReadTSV(myFile);
foreach(var chunk in chunks)
{
   DoSometingOnAChunk(chunk[0], chunk[1]);
}
它将使用更少的内存,并且启动速度更快,而不是先暂停阅读整个内容。这样的代码可以毫无怨言地在千兆字节中愉快地运行。

就像这样(您已经拥有了一个字符串):

提供一个
IEnumerable
生成变量,如列表列表、数组数组等,只需要合适的
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');
}
或者,将行
yield return line.Split('\t');
更改为
yield return line.Split('\t');
,您将得到一个
列表

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

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

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

File.ReadAllLines将为您提供行数组。然后您可以使用\t拆分每一行作为列。Datatable最好存储此数据文件是大还是小通常,您希望逐行流式传输数据,这样您就不需要在内存中保存整个内容。可能很大。就像8MB的文本文件。现在重写我的问题是否为时已晚?考虑到每个人的评论,我真的想问一个更广泛的问题。那就是,如何将以制表符分隔的文本文件读入列表?或者,我是否应该开始一个新的问题新线程?在一个文本文件中,我有50000行数据。每行包含2列字符串。我使用上面的代码将文本文件读入字符串。@phan,这将倾向于不使用
ReadToEnd()
然后,但使用像我的回答中那样的方法,一次只读一行。理想情况下,然后对结果进行
foreach
,但即使你
ToArray()
至少在任何点都不加载8MB的字符串。File.ReadAllLines将为您提供一个行数组。然后,您可以使用\t拆分每一行作为列。Datatable最好存储此数据文件是大文件还是小文件?通常您希望逐行流式传输数据,这样就不需要将整个内容保存在备忘录中ry。可能很大。像8MB的文本文件。现在重写我的问题是否太晚了?我真的想问一个更广泛的问题,现在考虑到每个人的评论。那就是,如何将以制表符分隔的文本文件读入列表?或者,我应该为此启动一个新线程?在一个文本文件中,我有50000行数据。每行包含2列stri我使用上面的代码将文本文件读入字符串。@phan,这将倾向于不使用
Rea
var myFile = new StreamReader("f:\\data.txt");
var chunks = ReadTSV(myFile);
foreach(var chunk in chunks)
{
   DoSometingOnAChunk(chunk[0], chunk[1]);
}