Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用CsvHelper将CSV中的所有值读取到列表中_C#_Csv_Csvhelper - Fatal编程技术网

C# 使用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

所以我一直在读,我不应该写我自己的CSV读写器,所以我一直在尝试使用通过nuget安装的CsvHelper库。CSV文件是灰度图像,行数表示图像高度,列数表示宽度。我想将值逐行读取到单个
列表
列表

到目前为止,我掌握的代码是:

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();

    }