【问题标题】:Read columns from file从文件中读取列
【发布时间】:2014-02-01 18:57:34
【问题描述】:

我有包含数字列的 test.prp 文件。我在下面添加了它。我想从第 3 行到第 6 行读取第二列和第三列并将它们写入 dene.txt。第一列有问题。我怎么能用 c# 代码做到这一点?我还添加了我的代码。

文件内容:

   1
  41
   1    0.0000000000E+00    0.1000000000E+00    0.2000000000E+02    0.3901678858E+00    0.0000000000E+00    0.0000000000E+00    0.1512811745E-04    0.9999999999E+00    0.0000000000E+00    0.0000000000E+00    0.0000000000E+00    0.1000000000E+01    0.9999999999E+00   -0.1512811745E-04    0.0000000000E+00
 973    0.3925981578E-02    0.9992290362E-01    0.2000000000E+02    0.3901543748E+00    0.0000000000E+00    0.0000000000E+00    0.3927493226E-01    0.9992284422E+00    0.0000000000E+00    0.0000000000E+00    0.0000000000E+00    0.1000000000E+01    0.9992284422E+00   -0.3927493226E-01    0.0000000000E+00
 975    0.7845909576E-02    0.9969173337E-01    0.2000000000E+02    0.3901465010E+00    0.0000000000E+00    0.0000000000E+00    0.7847417723E-01    0.9969161467E+00    0.0000000000E+00    0.0000000000E+00    0.0000000000E+00    0.1000000000E+01    0.9969161467E+00   -0.7847417723E-01    0.0000000000E+00
 977    0.1175373975E-01    0.9930684570E-01    0.2000000000E+02    0.3899423873E+00    0.0000000000E+00    0.0000000000E+00    0.1175524208E+00    0.9930666787E+00    0.0000000000E+00    0.0000000000E+00    0.0000000000E+00    0.1000000000E+01    0.9930666787E+00   -0.1175524208E+00    0.0000000000E+00

文件结束

代码如下:

string oku = File.ReadAllText("test.prp");
while (oku != null)
{
    oku = oku.Remove(4, 4);

    File.WriteAllText("dene.txt", oku);
}

【问题讨论】:

  • 就像您正在寻找 CSV 解析器一样...
  • 文件内容 (test.prp) 是否始终相同(如已发布)还是可变长度...例如它总是 6 行长吗?所需的数据总是从第 3 行到第 6 行
  • 数字变化但长度不变

标签: c# text multiple-columns


【解决方案1】:

您可以使用Skip + TakeString.Split + String.Join

File.WriteAllLines("dene.txt", File.ReadLines("test.prp")
    .Skip(2).Take(4)
    .Select(l => string.Join(" ", l.Split().Skip(1).Take(2))));

我不知道分隔符所以我假设一个空格

【讨论】:

  • 分隔符是四个空格字符我的主要问题是读取这两列并将它们添加到 Visual Studio 的 x-y 散点图中
【解决方案2】:
string[] oku = File.ReadAllLines("Input.txt");
string[][] cells = oku.Select(x => x.Split(new[] { " " }, StringSplitOptions.RemoveEmptyEntries).ToArray()).ToArray();

现在,您可以轻松获取所需的行/列,例如第三行第二列:

var value = cells[2][1];

请记住,数组是从0 开始索引的,所以第二列实际上在[1] 之下。

顺便说一句。您当前的代码有无限循环...

【讨论】:

    【解决方案3】:

    为什么不将文件读入string[] 数组,然后string.Split 每行使用<space> 分隔符。

    string[] oku = File.ReadAllLines("test.prp");
    foreach(string sLine in oku)
    {
        string[] columns = sLine.Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
    
        // Check for columns here.
        if (columns.Length >= 2)
        {
            string col2_and_3 = columns[1]+" "+colunms[2];
    
            // Do something with col2_and_3
       }
    }
    

    string[] columns 将拥有每一行的所有数据,您可以使用columns.Length 查看是否有您需要的额外列。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 1970-01-01
      • 2013-04-14
      • 2020-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多