C# 使用CsvHelper将CSV中的所有值读取到列表中
所以我一直在读,我不应该写我自己的CSV读写器,所以我一直在尝试使用通过nuget安装的CsvHelper库。CSV文件是灰度图像,行数表示图像高度,列数表示宽度。我想将值逐行读取到单个C# 使用CsvHelper将CSV中的所有值读取到列表中,c#,csv,csvhelper,C#,Csv,Csvhelper,所以我一直在读,我不应该写我自己的CSV读写器,所以我一直在尝试使用通过nuget安装的CsvHelper库。CSV文件是灰度图像,行数表示图像高度,列数表示宽度。我想将值逐行读取到单个列表或列表 到目前为止,我掌握的代码是: using CsvHelper; public static List<string> ReadInCSV(string absolutePath) { IEnumerable<string> allValues; using
列表
或列表
到目前为止,我掌握的代码是:
using CsvHelper;
public static List<string> ReadInCSV(string absolutePath)
{
IEnumerable<string> allValues;
using (TextReader fileReader = File.OpenText(absolutePath))
{
var csv = new CsvReader(fileReader);
csv.Configuration.HasHeaderRecord = false;
allValues = csv.GetRecords<string>
}
return allValues.ToList<string>();
}
使用CsvHelper;
公共静态列表ReadInCSV(字符串绝对路径)
{
i可数所有值;
使用(TextReader fileReader=File.OpenText(绝对路径))
{
var csv=新的CsvReader(文件阅读器);
csv.Configuration.HasHeaderRecord=false;
allValues=csv.GetRecords
}
返回allValues.ToList();
}
但是allValues.ToList()
正在抛出一个:
用户代码未处理CsvConfigurationException
CsvHelper.dll中发生类型为“CsvHelper.Configuration.CsvConfigurationException”的异常,但未在用户代码中处理
其他信息:无法自动映射继承IEnumerable的类型。您是否意外调用了作用于单个记录的GetRecord或WriterRecord,而不是作用于记录列表的GetRecords或WriterRecords
GetRecords
可能需要我自己的自定义类,但我只需要将值作为某种基本类型或字符串。此外,我怀疑整行正在转换为单个字符串,而不是每个值都是一个单独的字符串。很接近。它并不是在尝试将行转换为字符串。CsvHelper尝试使用标题行中给定的名称,将行中的每个字段映射到您给定类型的属性。此外,它不知道如何使用IEnumerable
类型(由string
实现)执行此操作,因此它只是在测试类型时自动映射到该点时抛出
这对你所做的事情来说是非常复杂的。如果您的文件格式足够简单,而您的文件格式似乎是——众所周知的字段格式,既不是转义分隔符也不是引号分隔符——我看不出有什么理由需要承担导入库的开销。您应该能够根据需要使用
System.IO.File.ReadLines()
和String.Split()
枚举值
//伪代码……您不需要CsvHelper
IEnumerable GetFields(字符串文件路径)
{
foreach(File.ReadLines(filepath)中的字符串行)
{
foreach(row.Split(',')中的字符串字段)生成返回字段;
}
}
根据@Marc L的帖子,你可以试试这个:
public static List<string> ReadInCSV(string absolutePath) {
List<string> result = new List<string>();
string value;
using (TextReader fileReader = File.OpenText(absolutePath)) {
var csv = new CsvReader(fileReader);
csv.Configuration.HasHeaderRecord = false;
while (csv.Read()) {
for(int i=0; csv.TryGetField<string>(i, out value); i++) {
result.Add(value);
}
}
}
return result;
}
公共静态列表ReadInCSV(字符串绝对路径){
列表结果=新列表();
字符串值;
使用(TextReader fileReader=File.OpenText(绝对路径)){
var csv=新的CsvReader(文件阅读器);
csv.Configuration.HasHeaderRecord=false;
而(csv.Read()){
for(int i=0;csv.TryGetField(i,out值);i++){
结果:增加(价值);
}
}
}
返回结果;
}
如果只需要数组中每一行的字符串值,则可以直接使用解析器
var parser = new CsvParser( textReader );
while( true )
{
string[] row = parser.Read();
if( row == null )
{
break;
}
}
更新
版本3支持读取和写入
IEnumerable
属性。请尝试此操作。这对我很有效
TextReader reader = File.OpenText(filePath);
CsvReader csvFile = new CsvReader(reader);
csvFile.Configuration.HasHeaderRecord = true;
csvFile.Read();
var records = csvFile.GetRecords<Server>().ToList();
这里的要点是读取CSV的所有行并将其反序列化为对象集合。我不知道你为什么要把它当作字符串的集合来读。如前所述,在这种情况下,Generic
ReadAll()
可能最适合您。当您将此库用于此目的时,它会发光:
using System.Linq;
...
using (var reader = new StreamReader(path))
using (var csv = new CsvReader(reader))
{
var yourList = csv.GetRecords<YourClass>().ToList();
}
使用System.Linq;
...
使用(变量读取器=新的流读取器(路径))
使用(var csv=新的CsvReader(读卡器))
{
var yourList=csv.GetRecords().ToList();
}
如果您不使用ToList()
-它将一次返回一条记录(为了更好的性能),请阅读静态void WriteCsvFile(字符串文件名,IEnumerable people)
{
StreamWriter textWriter=File.CreateText(文件名);
var csvWriter=新的csvWriter(textWriter,System.Globalization.CultureInfo.CurrentCulture);
csvWriter.WriterRecords(人);
textWriter.Close();
}
您能为我们提供有关CSV配置异常的更多信息吗?有消息吗?这样调用.ToLIst()几乎总是一个错误。尽可能长时间地使用IEnumerable以获得最佳性能。可能会有助于显示您的CSV文件。无论如何,另一个选择是。不确定它在这里是否有用,但我发现它的平均速度大约是CsvHelper的四倍。所以CsvHelper设计用于处理具有特定列的CSV文件,并将它们传递到包含这些列参数的自定义类中?在我的情况下,是否可以使用CsvHelper,或者这需要迭代每个字段?老实说,我以前没有使用过它,但是仔细阅读文档和您收到的错误表明它不是为您的任务构建的。你也许可以改变它来获得你所需要的,但我认为在这一点上,你最好只使用你可用的CLR工具。我认为这不是一个正确的方法。csv文件可以包含带引号的文本,其中包含逗号,并且不能在任何位置拆分comma@MarcL. 你是什么意思?这给出了我最初寻求的答案,所以我接受这个答案,但我认为@MarcL。是正确的,因为CsvHelper似乎不是为我拥有的CSV文件而设计的。你知道你可以使用VB CSV库来解析CSV文件,对吗?您可以引用它并像使用c#库一样使用它代码>是否也在using()语句中,因为CsvReader是IDisposable?(可能不是回答这个问题的时候)只是好奇:这真的给了你一些你在File.ReadAllLines()
中没有得到的东西吗
public class Server
{
private string details_Table0_ProductName;
public string Details_Table0_ProductName
{
get
{
return details_Table0_ProductName;
}
set
{
this.details_Table0_ProductName = value;
}
}
private string details_Table0_Version;
public string Details_Table0_Version
{
get
{
return details_Table0_Version;
}
set
{
this.details_Table0_Version = value;
}
}
}
using System.Linq;
...
using (var reader = new StreamReader(path))
using (var csv = new CsvReader(reader))
{
var yourList = csv.GetRecords<YourClass>().ToList();
}
static void WriteCsvFile(string filename, IEnumerable<Person> people)
{
StreamWriter textWriter = File.CreateText(filename);
var csvWriter = new CsvWriter(textWriter, System.Globalization.CultureInfo.CurrentCulture);
csvWriter.WriteRecords(people);
textWriter.Close();
}