从CSV文件中获取错误的字符串网格

时间:2012-12-19 11:08:54

标签: c# .net csv

这是我使用this URL上的CsvFileReader类从CSV文件中获取字符串网格的代码

static void Main(string[] args)
{
  // Read sample data from CSV file
  ArrayList list = new ArrayList();
  List<string> U = new List<string>();
  U.Clear();
  list.Clear();
  using (CsvFileReader reader = new CsvFileReader(@"C:\\path_to_file\file.csv"))
  {
    CsvRow row = new CsvRow();
    while (reader.ReadRow(row))
    {
      U.Clear();
      foreach (string s in row)
      {
        //Console.Write(s);
        //Console.Write(" ");
        U.Add(s);
      }
      list.Add(U);
      //Console.WriteLine();
    }
  }

  Console.WriteLine(list);
  Console.ReadLine();
}

但是我没有得到我想要的字符串网格。 'list'仅包含最后一个csv行的重复副本,它等于CSV文件中的行数,而不是我正在寻找的确切网格。

2 个答案:

答案 0 :(得分:1)

我不知道你的字符串“grid”是什么意思,但我想你的意思是List对于CSV文件的每一行都包含List<string>

您的基本错误是反复使用内部循环的相同列表(U)。 List<T>是C#中的引用类型,因此您最终会一次又一次地添加完全相同的对象。

我没有测试过这些代码,但是这些代码中的某些内容应该可以运行。

static void Main(string[] args)
{
  // Read sample data from CSV file
  List<List<string>> list = new List<List<string>>();
  using (CsvFileReader reader = new CsvFileReader(@"C:\\path_to_file\file.csv"))
  {
    CsvRow row = new CsvRow();
    while (reader.ReadRow(row))
    {
      List<string> rowList = new List<string>();
      foreach (string s in row)
      {
        //Console.Write(s);
        //Console.Write(" ");
        rowList.Add(s);
      }
      list.Add(rowList);
      //Console.WriteLine();
    }
  }

  foreach (List<string> rowList in list)
  {
     foreach (string cellData in rowList)
     {
        Console.Write(cellData + "\t");
     }
     Console.WriteLine();
  }
  Console.ReadLine();
}

答案 1 :(得分:0)

我可以为您提供一个函数来将制表符分隔的csv读入datatable: 将Excel保存到制表符分隔的csv,您可以阅读它。

    public static DataTable ParseCSV(string path)
    {
        var dt = new DataTable();
        using (var sr = new StreamReader(path, Encoding.UTF8))
        {
            string line;
            while ((line = sr.ReadLine()) != null)
            {
                string[] items = line.Split('\t');
                items[1] = ToUpperFirstLetter(items[1].ToLower());
                if (dt.Columns.Count == 0)
                {
                    // column names
                    foreach (string t in items)
                        dt.Columns.Add(new DataColumn(t.Trim(), typeof(string)));
                }
                else
                {
                    //data
                    dt.Rows.Add(items);
                }
            }
        }
        return dt;
    }

用法:

    var dt = ParseCSV("c:\\data\\some.txt")