1

这是我使用此 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();
}

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

4

2 回答 2

1

我不知道字符串“grid”是什么意思,但我猜你的意思是'sList将包含List<string>CSV 文件的每一行。

您的基本错误是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();
}
于 2012-12-19T11:22:15.673 回答
0

我可以为您提供一个将制表符分隔的 csv 读取到数据表中的功能:将 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")
于 2012-12-19T11:25:29.223 回答