我有很多不同的CSV文件,其中包含数据(包括标题)。 我无法弄清楚如何在第一个帖子中添加一个列并用文件名值(每行)填充第一个单元格。
有人能帮助我吗?
提前致谢
答案 0 :(得分:1)
如果您的csv-Files足够小,可以将它们加载到您的内存中
// #1 Read CSV File
string[] CSVDump = File.ReadAllLines(@"c:\temp.csv");
// #2 Split Data
List<List<string>> CSV = CSVDump.Select(x => x.Split(';').ToList()).ToList();
//#3 Update Data
for (int i = 0; i < CSV.Count; i++)
{
CSV[i].Insert(0, i == 0 ? "Headername" : "Filename");
}
//#4 Write CSV File
File.WriteAllLines(@"c:\temp2.csv", CSV.Select(x => string.Join(";", x)));
答案 1 :(得分:0)
在第一个位置添加列是一种特殊情况,无需CSV解析即可实现。您只需要在每个字符串前加上所需的值和逗号。唯一的例外是第一行应该添加标题名称:
string newColumnHeader = "FileName";
string textToPrepend = @"some\file\name";
long lineNumber = 0;
using (StreamWriter sw = File.CreateText("output.csv"))
foreach (var line in File.ReadAllLines("input.csv"))
sw.WriteLine(
(lineNumber++ == 0 ?
newColumnHeader :
textToPrepend) +
"," + line);
答案 2 :(得分:0)
我会做更多的编码。首先将CSV读入DataTable
public static DataTable ConvertCSVtoDataTable(string strFilePath)
{
StreamReader csv = new StreamReader(strFilePath);
string[] headers = csv .ReadLine().Split(',');
DataTable dtCSV = new DataTable();
foreach (string header in headers)
{
dtCSV.Columns.Add(header);
}
while (!csv.EndOfStream)
{
string[] rows = csv.ReadLine().Split(',');
DataRow dr = dt.NewRow();
for (int i = 0; i < headers.Length; i++)
{
dr[i] = rows[i];
}
dt.Rows.Add(dr);
}
return dtCSV;
}
然后将列插入我想要的位置:
DataColumn Col = dtCSV.Columns.Add("FileName", System.Type.GetType("System.String"));
Col.SetOrdinal(0);
列中的所有值都返回CSV:
var lines = new List<string>();
string[] columnNames = dataTable.Columns.Cast<datacolumn>().
Select(column => column.ColumnName).
ToArray();
var header = string.Join(",", columnNames);
lines.Add(header);
var valueLines = dt.AsEnumerable()
.Select(row => string.Join(",", row.ItemArray));
lines.AddRange(valueLines );
File.WriteAllLines("File.csv",lines);