通过c#从文本文件中读取列

时间:2014-01-04 12:39:09

标签: c# arrays text-files

我有这个文本文件

688.63        C         1          C        0          0         0
698.70        C         1          C        0          0         0
708.89        C         1          C        0          0         0
716.78        C         1          C        0          0         0
718.97        C         1          C        0          0         0
728.27        C         1          C        0          0         0
728.89        C         1          C        0          0         0
738.82        C         1          C        0          0         0
759.00        C         1          C        0          0         0

问题是如何读取数组中的每一列??

如果我想访问列的特定值呢? 比如第一列的值2 ......

5 个答案:

答案 0 :(得分:4)

您可以使用File.ReadAllLines方法。

  

打开文本文件,读取文件的所有行,然后关闭   文件。

来自MSDN的示例;

string path = @"c:\temp\MyTest.txt";
string[] lines = File.ReadAllLines(path);

这将创建一个逐行保持字符串的数组。

  

如果我想要获取列的特定值呢?喜欢   第一列的值2

如果所有值之间的空格相同,则可以使用String.Split方法;

string s = "688.63        C         1          C        0          0         0";
var array = s.Split(new string[]{"        "}, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(array[1]); // Prints "C"

这里有 demonstration

在您的情况下,您可以使用;

var array = lines[1].Split(new string[]{"        "}, StringSplitOptions.RemoveEmptyEntries);
Console.WriteLine(array[0]); // Prints "698.70"

line[1]在你的文字中找到第二行,array[0]获得此行698.70的第一个值。

  

我希望它像这样打印688.63 698.70 708.89所有值的第一个   列不仅仅是第一个值。

您可以使用foreach之类的;

string[] lines = File.ReadAllLines(path);
foreach(var line in lines)
{
  var firstValue = line.Split(new string[]{"        "}, StringSplitOptions.RemoveEmptyEntries)[0];
  Console.WriteLine(firstValue);
}

答案 1 :(得分:3)

您可以使用File.ReadAllLines

  

File.ReadAllLines返回一个数组。该数组包含一个字符串   指定文件中的每一行。我们使用这种方法。然后我们看   在其.NET Framework实现中,了解它的工作原理。它是   在System.IO命名空间中找到。   打开文本文件,读取文件的所有行,然后关闭   文件。

File.ReadAllLines方法不是低级实现。相反,它使用List和StreamReader类型,然后使用ToArray来返回数组。如果要将文件放入List中,这效率很低。

如果需要优化File.ReadAllLines调用,可以在其构造函数中估计List的容量,这会减少调整大小。如果你想保留List,你也可以避免使用ToArray。

List Examples

Using StreamReader

ToArray Extension Method

Capacity Property

使用this

string[] records = File.ReadAllLines(path);
foreach(string record in records)
{
  DataRow r = myDataTable.NewRow();
  string[] fields = record.Split('\t');
  /* Parse each field into the corresponding r column
   * ....
   */
  myDataTable.rows.Add(r);
}

答案 2 :(得分:0)

答案 3 :(得分:0)

我想你需要two dimensional array

 string[] lines = File.ReadAllLines("path");

 string[][] myRecords = new string[lines.Count()+1][];
 int k = 1;
 foreach (var line in lines)
 {
     var values = line.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
     for (int i = 1; i < values.Length; i++)
     {
        if (myRecords[k] == null) myRecords[k] = new string[values.Length+1];
        myRecords[k][i] = values[i];
     }
     k++;
   }

然后您可以访问一个值,例如第1行第3列:

myRecord[1][3]

答案 4 :(得分:0)

您可以创建一个Record类,然后使用简单的LINQ查询:

var records = File.ReadLines("file.txt") .Select(line => { string[] parts = line.Split('\t'); return new Record { column1 = int.Parse(parts[0]), column2= parts[1], column3= int.Parse(parts[2]), column4= parts[3], column5= int.Parse(parts[4]), column6= int.Parse(parts[5]), column7= int.Parse(parts[6]) }; }).ToArray();

这将为您提供一堆记录,原始文件中每行一个。然后您可以选择记录中的列,如下所示

var allColumn1s = records.Select(rec => rec.column1);