【问题标题】:How to pass quotes from csv to writed file by CsvHelper如何将 csv 中的引号传递给 CsvHelper 写入的文件
【发布时间】:2020-04-14 08:34:26
【问题描述】:

请帮忙。有关于 CsvHelper 库的问题。我使用动态记录并想按原样传递双引号,或者可能更好地将双引号更改为单引号。但是图书馆会一直删除引号。

var csvHelperConfig = new Configuration();
var csv = new CsvReader(reader, csvHelperConfig);
var record = csv.GetRecord<dynamic>() as IDictionary<string, object>;



LANGUAGE,TITLE,CODE,UPDATED
"EN","English, English, English",1,"01.01.2000"
"DE","German",2,"01.01.2000"

感谢您的回答!

【问题讨论】:

  • How to Askminimal reproducible example。对您的问题进行简短的复制。使用包含虚假数据和您的测试用例的简短 CSV。您可以在几分钟内使用 Excell 生成 CSV。现在你的问题有点不清楚?你有未转义的报价吗?如果是这种情况,我们将需要 CSV 的这一部分。
  • RFC 4180,应该涵盖这些情况。阅读第 2 节。 5/6/7 “如果使用双引号括住字段,则出现在字段中的双引号必须通过在其前面加上另一个双引号来进行转义”,正确的 espace 方法是使用 ""
  • 也许你只是在寻找reader.Configuration.IgnoreQuotes = true;
  • 而且顺便说一句,如果您有关于该对象真正是什么的信息,请不要使用dynamicdynamic 只是当你需要告诉程序:“我放弃了那种类型。你必须在运行时弄清楚。不要问我问题。”。
  • 对不起,可能是我的英语不够好。我也在谈论双引号。您的评论没有说明引号是否被转义?它没有提供有关 CSV 格式有效性的信息。

标签: csvhelper


【解决方案1】:

它并不完全漂亮,但我相信它可以满足您的要求。

public static void Main(string[] args)
{
    using (MemoryStream stream = new MemoryStream())
    using (StreamWriter writer = new StreamWriter(stream))
    using (StreamReader reader = new StreamReader(stream))
    using (CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        writer.WriteLine("LANGUAGE,TITLE,CODE,UPDATED");
        writer.WriteLine("\"EN\",\"English, English, English\",1,\"01.01.2000\"");
        writer.WriteLine("\"DE\",\"German\",2,\"01.01.2000\"");
        writer.Flush();
        stream.Position = 0;

        var records = new List<dynamic>();

        csv.Read();
        csv.ReadHeader();

        while (csv.Read())
        {
            var startIndex = 0;
            dynamic dynamicObject = new ExpandoObject();

            for (int i = 0; i < csv.Context.HeaderRecord.Length; i++)
            {
                var item = csv.GetField<string>(i);

                var foundIndex = csv.Context.RawRecord.IndexOf(item, startIndex);

                startIndex = foundIndex;

                if (csv.Context.RawRecord[foundIndex - 1] == '"')
                {
                    item = '"' + item + '"';
                }

                IDictionary<string, object> underlyingObject = dynamicObject;

                underlyingObject.Add(csv.Context.HeaderRecord[i], item);
            }

            records.Add(dynamicObject);
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    相关资源
    最近更新 更多