在第一个位置添加列,并用文件名填充第一列

本文关键字:填充 一列 文件名 位置 第一个 添加 | 更新日期: 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);