FileHelpers:读取文件时如何处理引用的字段

FileHelpers: How to handle quoted fields when reading file

这是我要读取的数据:

"Adam C. Emality","1Z620Y1V034826","14.40"
"Ethel Baeron","1Z620Y1V034604","15.19"
"Donna Lidt","1Z620Y1V034650","12.37"

然后在读入数据后,我想对两个集合执行 Join,一个是数组,一个是列表——我的代码如下。然而,在执行读取文件行后,我的字符串存储如下 "\"Adam C. Emality\"" "\"1Z620Y1V034826\"" "\"14.40\""...等等。为什么会这样?我不想包括 " 并且我不知道为什么要添加 \.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FileHelpers;
using Parser;

namespace Amazon_File
{
    class SpreadSheet
    {
        public void create(IEnumerable<SpreadList> list)
        {


            var steamengine = new FileHelperEngine<Records>();
            var records = steamengine.ReadFile(@"C:\Users\Danny\Documents\Visual Studio 2013\Projects\Amazon File\Amazon File\Daniel.csv");

            var spreadlist = from x in list
                             join y in records on x.Name equals y.Name
                             select new { y.Name, y.Track, y.worldPrice, x.ItemPrice, x.Quantity };



[DelimitedRecord(",")]
    public class Records
    {

        public string Name;

        public string Track;

        public string worldPrice;
    }   

public class SpreadList
    {
        public string Name { get; set; }
        public string Title { get; set; }
        public string ItemPrice { get; set; }
        public string Quantity { get; set; }
    }
}

发生这种情况是因为您正在将文件作为扁平字符串读取。该文件包含引号,因此它们也会被读入。这是标准的 CSV 格式。

斜杠在 C# 中用作转义字符。所以\"真的只是"。您需要将引号替换为空引号 trim 引号,或者使用 CSV 库正确读入文件。就个人而言,我以前使用过 CSVHelper,它非常棒。您可以从 nuget 包管理器获取它。

例如

var newstring = oldstring.Replace("\"", string.Empty);

您可以访问 FileHelperEngine 吗?如果是这样,您应该看看它是如何解析文件的。否则,您可以遍历列表并删除引号或在对象的设置器或您认为适合您的解决方案的任何内容中删除引号。

CSV 解析器现在是 .NET Framework 的一部分。

添加对 Microsoft.VisualBasic.dll 的引用(在 C# 中工作正常,不要介意名称)

using (TextFieldParser parser = new TextFieldParser(@"c:\temp\test.csv"))
{
    parser.TextFieldType = FieldType.Delimited;
    parser.SetDelimiters(",");
    while (!parser.EndOfData) 
    {
        //Process row
        string[] fields = parser.ReadFields();
        foreach (string field in fields) 
        {
            //TODO: Process field
       }
    }
    parser.Close();
}

文档是 Here

您必须添加 [FieldQuoted] 以使库自动删除它们 http://www.filehelpers.net/docs/html/T_FileHelpers_FieldQuotedAttribute.htm

[DelimitedRecord(",")]
public class Records
{
    [FieldQuoted]
    public string Name;

    [FieldQuoted]
    public string Track;

    [FieldQuoted]
    public string worldPrice;
}