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

时间:2015-06-09 13:04:15

标签: c# csv

我有很多不同的CSV文件,其中包含数据(包括标题)。 我无法弄清楚如何在第一个帖子中添加一个列并用文件名值(每行)填充第一个单元格。

有人能帮助我吗?

提前致谢

3 个答案:

答案 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);