在第一个位置添加列,并用文件名填充第一列
本文关键字:填充 一列 文件名 位置 第一个 添加 | 更新日期: 2023-09-27 17:54:29
我有很多不同的CSV文件,其中包含数据(包括头)。我不知道如何在第一个位置添加一列,并使用文件名值(每一行)填充第一个单元格。
有人能帮我吗?Thanks in advance
如果你的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)));
在第一个位置添加列是一种特殊情况,无需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);
我将编写更多的代码。首先将CSV in读入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);