CsvHelper 分隔符与行尾字符相同 文件结构问题解决问题的尝试问题

如何解决CsvHelper 分隔符与行尾字符相同 文件结构问题解决问题的尝试问题

我在解析一些我知道如何修复的类似 csv 的文件时遇到了一个问题,但我想确认这是否是合适的方法


文件结构

我试图解析的文件具有与 .csv 类似的结构类似,因为它的值用分隔符分隔(在我的例子中是 |),但是与我之前看到的不同的是,它在行尾还有一个分隔符,例如:

Column1|Column2|Column3|
Row1Val1|Row1Val2|Row1Val3|
Row2Val1|Row2Val2|Row2Val3|

问题

当我编写一些单元测试来覆盖我的服务时,问题就出现了,这些服务包装在 CsvHelper 库上。当我提供以下配置时,显然存在一些问题:

var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    Delimiter = "|",HasHeaderRecord = true,NewLine = "|\r\n"
};

使用上述配置,csvReader.GetRecords() 不会返回任何结果。我相信这是因为解析器的操作顺序是首先查找列,然后是行尾 - 它试图解析空列而没有意识到它实际上是分隔符的一部分。

(我也可以粘贴 getRecords 调用代码,但它基本上是从示例中提取的通用代码 - 唯一的区别是我使用了 System.IO.Abstractions 库以便于进行单元测试)


解决问题的尝试

如果我删除 NewLine 配置值,解析器在读取文件时工作正常(即使文件末尾有行尾分隔符)。然而,我的“写入 CSV”测试失败了,因为 CsvHelper 不再向文件添加正确的行尾。


问题

有什么方法可以配置 CsvHelper 以使用一种配置覆盖这两种情况,还是应该基本上使用两种不同的配置,具体取决于我是写入 CSV 还是从中读取?这对我来说似乎有点违反直觉,因为它与我试图遵循的格式基本相同,但预期会有不同的配置?

解决方法

您可以手动为每一行写入空列,然后您可以保持读取和写入的配置相同。

void Main()
{
    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        Delimiter = "|"
    };
    
    var records = new List<MyClass>
    {
        new MyClass {Column1 = "Row1Val1",Column2 = "Row1Val2",Column3 = "Row1Val3"},new MyClass {Column1 = "Row2Val1",Column2 = "Row2Val2",Column3 = "Row2Val3"}
    };

    using (var writer = new StreamWriter("file.csv"))
    using (var csv = new CsvWriter(writer,config))
    {
        csv.WriteHeader<MyClass>();
        csv.WriteField(string.Empty);

        foreach (var record in records)
        {
            csv.NextRecord();
            csv.WriteRecord(record);
            csv.WriteField(string.Empty);
        }       
    }

    using (var reader = new StreamReader("file.csv"))
    using (var csv = new CsvReader(reader,config))
    {
        var importRecords = csv.GetRecords<MyClass>();
        importRecords.Dump();
    }
}

public class MyClass
{
    public string Column1 { get; set; }
    public string Column2 { get; set; }
    public string Column3 { get; set; }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?