尝试将一列添加到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;
任何建议都会受到欢迎。
答案 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);