【问题标题】:C# - How to write a List<List<string>> to CSV file?C# - 如何将 List<List<string>> 写入 CSV 文件?
【发布时间】:2013-06-27 09:48:14
【问题描述】:

我想使用 C# 将一些数据写入 CSV 文件。

这是我目前的代码:

int length = readData.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Length;

List<List<string>> dataList = new List<List<string>>();

foreach (string line in readData.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
{
    List<string> partsLine = new List<string>();
    partsLine.AddRange(line.Split('\t'));
    dataList.Add(partsLine);
}          

所以,我将所有数据分成几行。

然后我用'\t'分隔符分割每一行,并将该行的每一部分添加到一个列表中。

最后我有一个包含所有分割线列表的列表。

所以列表看起来像:

  • List1 {txt1, txt 2} = 第一行
  • List2 {txt3, txt 4, txt 5, txt 6} = 第二行
  • List3 {txt7, txt 8, txt 9, txt 10} = 第三行
  • List4 {txt 11, txt 12} 等

所有列表的长度都不一样。

我想做的是将所有列表写入 CSV 文件。

每个列表将填充一行和一定数量的列,具体取决于列表的长度(即 txt1 应为 (row1, col1),txt2 应为 (row1, col2),txt3 应为 (row2, col1 ), txt4 将是 (row2, col2)...)。

我该怎么做?

谢谢

【问题讨论】:

    标签: c# csv split


    【解决方案1】:
    List<List<String>> dataList = new List<List<string>>();
    //...
    const char SEPARATOR = ",";
    using (StreamWriter writer = new StreamWriter("file.csv"))
    {
        dataList.ForEach(line =>
        {
            var lineArray = line.Select(c =>
                c.Contains(SEPARATOR) ? c.Replace(SEPARATOR.ToString(), "\\" + SEPARATOR) : c).ToArray();
            writer.WriteLine(string.Join(SEPARATOR, lineArray));
        });
    }
    

    【讨论】:

    • 通过这段代码,它告诉我“System.Collections.Generic.List”不包含“Select”的定义。
    • 我的错,该项目使用的是旧框架,找不到 Linq。我测试了代码,它完全符合我的要求,谢谢。 :)
    【解决方案2】:

    CSV 格式本身并不打算使用具有可变列长度的行进行格式化。 CSV(逗号分隔值)只是“类似表格”的格式,所以如果你想遵循它的约定,你必须首先定义所有可能的列并一个接一个地填充行,所以几行上的几个单元格将保留空的。

    如果这不是您想要的,只需选择您的自定义格式。

    【讨论】:

      【解决方案3】:

      我回到这个话题,因为我意识到 .csv 格式不适合我的需要。

      我需要使用我拥有的所有数据绘制一些图表,并且我了解到 .csv 文件不支持图表集成。因此,我不想将我的List&lt;List&lt;string&gt;&gt; 导出为 .csv,而是将其导出为 .xls 文件。

      我试图通过在 StreamWriter 参数中将文件类型更改为 .xls 来做到这一点,但数据不像 .csv 那样适合。我应该在我的代码中进行哪些更改?

          // Write data to a .csv file
          private void WriteToCSV(string data)
          {
              int length = data.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Length;
      
              // List of lists containing each line split by part
              List<List<string>> dataList = new List<List<string>>();
      
              List<string> valuesA = new List<string>();
      
              // Building the list
              foreach (string line in data.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries))
              {
                  List<string> partsLine = new List<string>();
                  partsLine.AddRange(line.Split('\t'));
                  dataList.Add(partsLine);
              }
      
              const string separator = ";";
      
              // Writing the list to the .csv file
              try
              {
                  using (StreamWriter writer = new StreamWriter(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\output.xls", false))
                  {
                      dataList.ForEach(line =>
                      {
                          var lineArray = line.Select(c => c.Contains(separator) ? c.Replace(separator.ToString(), "\\" + separator) : c).ToArray();
                          writer.WriteLine(string.Join(separator, lineArray));
                      });
                  }
              }
              catch (Exception ex)
              {
                  Console.WriteLine("Error while writing data to .csv file (" + ex.Message + ")");
              }
      

      在图片上,您可以看到以前的格式(右侧的.csv)和新的格式(左侧的.xls)。 http://imageshack.us/photo/my-images/850/cax.png/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-20
        • 1970-01-01
        • 2012-12-26
        相关资源
        最近更新 更多