这是我使用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文件中的行数,而不是我正在寻找的确切网格。
答案 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")