我正在编写一个简单的导入应用程序,需要读取CSV文件,在a中显示结果DataGrid并在另一个网格中显示CSV文件的损坏行.例如,显示另一个网格中短于5个值的行.我试着这样做:
StreamReader sr = new StreamReader(FilePath);
importingData = new Account();
string line;
string[] row = new string [5];
while ((line = sr.ReadLine()) != null)
{
row = line.Split(',');
importingData.Add(new Transaction
{
Date = DateTime.Parse(row[0]),
Reference = row[1],
Description = row[2],
Amount = decimal.Parse(row[3]),
Category = (Category)Enum.Parse(typeof(Category), row[4])
});
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,在阵列上操作非常困难.有没有更好的方法来分割价值观?
Dav*_*uda 346
不要重新发明轮子.利用.NET BCL中已有的功能.
Microsoft.VisualBasic(是的,它说VisualBasic,但它也适用于C# - 请记住,最后它只是IL)Microsoft.VisualBasic.FileIO.TextFieldParser该类来解析CSV文件以下是示例代码:
using (TextFieldParser parser = new TextFieldParser(@"c:\temp\test.csv"))
{
parser.TextFieldType = FieldType.Delimited;
parser.SetDelimiters(",");
while (!parser.EndOfData)
{
//Processing row
string[] fields = parser.ReadFields();
foreach (string field in fields)
{
//TODO: Process field
}
}
}
Run Code Online (Sandbox Code Playgroud)
它在我的C#项目中对我很有用.
这里有一些更多的链接/信息:
adr*_*anm 36
我的经验是有许多不同的csv格式.特别是它们如何处理字段内的引号和分隔符的转义.
这些是我遇到的变种:
我已经尝试了许多现有的csv解析器,但没有一个可以处理我遇到的变种.从文档中找出解析器支持的转义变体也很困难.
在我的项目中,我现在使用VB TextFieldParser或自定义拆分器.
kno*_*cte 22
我推荐Nuget的CsvHelper.
(添加对Microsoft.VisualBasic的引用感觉不对,它不仅难看,甚至可能不是跨平台的.)
Man*_*ana 12
当您不想重新发明轮子时,有时使用库很酷,但在这种情况下,与使用库相比,可以用更少的代码行完成相同的工作并且更容易阅读.这是一种我觉得很容易使用的不同方法.
using (StreamReader reader = new StreamReader(fileName))
{
string line;
while ((line = reader.ReadLine()) != null)
{
//Define pattern
Regex CSVParser = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))");
//Separating columns to array
string[] X = CSVParser.Split(line);
/* Do something with X */
}
}
Run Code Online (Sandbox Code Playgroud)
CSV可以得到复杂的真正快.
使用强大且经过充分测试的东西:
FileHelpers:
www.filehelpers.net
FileHelpers是一个免费且易于使用的.NET库,用于从文件,字符串或流中的固定长度或分隔记录中导入/导出数据.
此列表中的另一个,Cinchoo ETL - 一个用于读写 CSV 文件的开源库
对于下面的示例 CSV 文件
Id, Name
1, Tom
2, Mark
Run Code Online (Sandbox Code Playgroud)
您可以使用如下库快速加载它们
using (var reader = new ChoCSVReader("test.csv").WithFirstLineHeader())
{
foreach (dynamic item in reader)
{
Console.WriteLine(item.Id);
Console.WriteLine(item.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
如果您有与 CSV 文件匹配的 POCO 类
public class Employee
{
public int Id { get; set; }
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
您可以使用它来加载 CSV 文件,如下所示
using (var reader = new ChoCSVReader<Employee>("test.csv").WithFirstLineHeader())
{
foreach (var item in reader)
{
Console.WriteLine(item.Id);
Console.WriteLine(item.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
请查看CodeProject 中有关如何使用它的文章。
免责声明:我是这个库的作者
| 归档时间: |
|
| 查看次数: |
227560 次 |
| 最近记录: |