c#将列添加到CSV文件的末尾

时间:2016-06-16 15:13:04

标签: c# csv

尝试将一列添加到cvs文件的末尾,这将只计算行数(或者可以是所有相同的数字),因为主要目的是添加一个包含一些数据的新列。

我的示例CSV文件有3列,每列都有一些随机数据。

目前我所拥有的是

    List<string> newColumnData = new List<string>() { "D" };
    List<string> lines = File.ReadAllLines(@"C:/CSV/test.csv").ToList();

    //add new column to the header row
    lines[0] += ",Column 4";
    int index = 1;

    //add new column value for each row.
    lines.Skip(1).ToList().ForEach(line =>
    {
        //-1 for header
        lines[index] += "," + newColumnData[index - 1];
        index++;
    });
    //write the new content
    File.WriteAllLines(@"C:/CSV/test.csv", lines);

然而,这引发了异常 &#34;索引超出范围必须是非负且小于集合的大小&#34;

任何建议都会受到欢迎。

4 个答案:

答案 0 :(得分:7)

你不应该在foreach中编入索引。 foreach一次为你提供一条线。

.Open "exec sp_MyProcedure @Node_Id = 05,@Subsidiary_Cd = '1',@WeekEndDate = '2016-05-28', @JobType = '12',@ReportLevel = 4"

lambda表达式意味着:获取列表中的每个元素,并将其称为“line”,然后执行大括号内的内容。

另外,正如我在这里看到的那样,你的newColumnData似乎只有一个项目,字符串“D”。然而,您正在为它编制索引,就好像此列表中有一个项目是您阅读的csv文件中的每一行。如果你的csv文件中有多行,那么这也会导致索引超出范围但是......没关系,我想的越多,你应该跟Dmitry Bychenko的答案越多。

答案 1 :(得分:5)

为什么这么多具体化 ReadAllLines().ToList()?为什么不呢

String filePath = @"C:/CSV/test.csv";

var csv = File.ReadLines(filePath) // not AllLines
  .Select((line, index) => index == 0 
     ? line + ",Column 4"
     : line + "," + index.ToString())
  .ToList(); // we should write into the same file, that´s why we materialize

File.WriteAllLines(filePath, csv);

答案 2 :(得分:0)

如果不进一步检查,我可以告诉你,你肯定会对你用于更新的lambda提出挑战:

    //add new column value for each row.
    lines.Skip(1).ToList().ForEach(line =>
    {
        //-1 for header
        lines[index] += "," + newColumnData[index - 1];
        index++;
    });

这对我来说更有意义:

    //add new column value for each row.
    lines.Skip(1).ToList().ForEach(line =>
    {
        line += "," + newColumnData[++index - 2];
    });

lines[index]部分在ForEach中没有意义,因为您分别循环遍历每一行。

答案 3 :(得分:0)

我怀疑newColumnData中没有足够的数据。试试这个,当出现这种情况时会给你一个适当的错误信息。如果文件为空,您也会收到错误。最后,你所拥有的解决方案是低效的,因为它必须在没有必要时将从File.ReadAllLines返回的字符串数组复制到列表中。

        List<string> newColumnData = new List<string>() { "D" };
        string[] lines = File.ReadAllLines(@"C:/CSV/test.csv");

        if (lines.Length == 0)
        {
            throw new InvalidOperationException("The file is empty");
        }

        //add new column to the header row
        lines[0] += ",Column 4";

        //add new column value for each row.
        for (int i = 1; i < lines.Length; i++)
        {
            int newColumnDataIndex = i - 1;
            if (newColumnDataIndex > newColumnData.Count)
            {
                throw new InvalidOperationException("Not enough data in newColumnData");
            }

            lines[i] += "," + newColumnData[newColumnDataIndex];
        }

        //write the new content
        File.WriteAllLines(@"C:/CSV/test.csv", lines);