【问题标题】:Writing to CSV without quotes on multi-valued columns在多值列上写入不带引号的 CSV
【发布时间】:2017-12-08 01:28:25
【问题描述】:

我正在尝试在 CSVHelper 的帮助下写入 CSV 文件,我正在编写的值之一具有如下值:{1,$1.00,2,$3.00}

由于列表中的逗号,它在输出中双引号,但我想禁用此功能。

我已阅读建议使用的文档 QuoteNoFields = true,但是我得到了错误

IReaderConfiguration 不包含 QuoteNoFields 的定义 当我尝试运行该项目时。

此方法已被弃用,还是我做错了什么?

        try
        {

            using (TextReader reader = File.OpenText(filepath))
            using (StreamWriter sw = new StreamWriter(@"C:\temp\mi_imp.txt"))
            using (CsvWriter writer = new CsvWriter(sw))


            {
                var csv = new CsvReader(reader);



                csv.Configuration.Delimiter = ",";
                csv.Configuration.HasHeaderRecord = true;
                csv.Configuration.HeaderValidated = null;
                csv.Configuration.MissingFieldFound = null;
                csv.Configuration.IgnoreQuotes = true;
                csv.Configuration.QuoteNoFields = true;

                var usersFromCsv = csv.GetRecords<ProductItem>();

                statuslabel.Content = "Status: Reading CSV";

                // ********************
                string menuItemNametemp;
                string buttontxt1temp;
                string buttontxt2temp;
                string kitchenprintertexttemp;
                string customerreceipttexttemp;
                string kitchenvideotexttemp;
                // ********************

                foreach (var item in usersFromCsv)
                {

                    // **** reset to null ****
                    menuItemNametemp = "";
                    buttontxt1temp = "";
                    buttontxt2temp = "";
                    kitchenprintertexttemp = "";
                    customerreceipttexttemp = "";
                    kitchenvideotexttemp = "";
                    // ************************

                    // ****** set default values *******

                    item.Action = "A";
                    item.PriceLevelID = "{1,$0.00}";
                    item.SecurityLevel = "0";
                    item.UseWeightFlag = "0";
                    item.WeightTare = "0";
                    item.BarGunCode = "";


                    // ********* build strings ************

                    buttontxt1temp = @"""" + item.ButtonTxt1 + @"""" + ",";
                    buttontxt2temp = @"""" + item.ButtonTxt2 + @"""" + ",";
                    menuItemNametemp = @"""" + item.MenuItemName + @"""" + ",";
                    kitchenprintertexttemp = @"""" + item.KitchenPrinterLabel + @""",";
                    customerreceipttexttemp = @"""" + item.ReceiptText + @""",";
                    kitchenvideotexttemp = @"""" + item.KitchenVideoText + @""",";

                    // *************************************


                    // *********** transfer to object *******

                    item.ButtonTxt1 = buttontxt1temp;
                    item.ButtonTxt2 = buttontxt2temp;
                    item.MenuItemName = menuItemNametemp;
                    item.KitchenPrinterLabel = kitchenprintertexttemp;
                    item.ReceiptText = customerreceipttexttemp;
                    item.KitchenVideoText = kitchenvideotexttemp;
                    // ****************************************

                    writer.WriteRecord(item);
                }

                statuslabel.Content = "Status: Complete";
            }

        }
        catch (Exception ex)
        {

            LogWriter log = new LogWriter(ex.ToString());

            statuslabel.Content = "Status: Error";
            textcontent.Text = "";
            MessageBox.Show("" + ex, "Error");


        }

我希望我的结果如下所示:

"A",9600015,"日期馅饼","日期","馅饼","日期馅饼",{1,$0.00},76,7,1,0,1,0,0,{}, ,$0.00,0,0,1,1,1,0,1,1,"日期挞",1,0,{215,0},{},0,0,"日期挞",0,0, 0,{},0

但是我得到了类似的东西

"A",9600015,"日期馅饼","日期","馅饼","日期馅饼","{1,$0.00}",76,7,1,0,1,0,0,{ },,$0.00,0,0,1,1,1,0,1,1,"日期挞",1,0,"{215,0}",{},0,0,"日期挞", 0,0,0,{},0

【问题讨论】:

  • 那你想要什么输出?
  • @slak 所需的格式应该是 {1,$1.00,2,$2.00} 例如,如上所述,值周围没有引号。
  • 这不是有效的 CSV。
  • @SLaks { } 充当具有多个值的某些字段的分隔符。
  • @Ash 您能否发布您用于编写字段的代码。查看joshclose.github.io/CsvHelper/writing#writing-fields 看起来您应该能够指定是否要在撰写本文时引用该字段。您还可以发布当前结果(与您想要的结果相比)以说明清楚。

标签: c# csv point-of-sale csvhelper


【解决方案1】:
    public void CreateCsv()
    {
        // populate data with records
        IEnumerable<SampleDataClass> data;

        var _csvConfiguration = new CsvHelper.Configuration.Configuration {
            ShouldQuote = (field, ctx) => false
        };
        using (var file = File.CreateText(_outputFileName))
        using (var csv = new CsvWriter(file, _csvConfiguration))
        {
            csv.WriteHeader<SampleDataClass>();

            csv.NextRecord();
            while (data.MoveNext())
            {
                csv.WriteRecord(data.Current);
                csv.NextRecord();
            }
        }
    }


    public class SampleDataClass
    {
        public string product_id { get; set; }

        public string order_id { get; set; }

        public string user_id { get; set; }

    }

【讨论】:

    【解决方案2】:

    经过一番搜索,我找到了解决方案。

    虽然我认为该方法已被弃用,因为它没有出现在 csv.configuration 下 - 我意识到我应该在 writer 实例化下设置此配置设置。

    using (TextReader reader = File.OpenText(filepath))
    using (StreamWriter sw = new StreamWriter(@"C:\temp\mi_imp.txt"))
    using (CsvWriter writer = new CsvWriter(sw))
    var csv = new CsvReader(reader);
    
     // what i was doing previously - incorrect
     csv.configuration.quotenofields = true;
     // correct solution
     writer.configuration.quotenofields = true;
    

    【讨论】:

      【解决方案3】:

      关闭引号的方式再次改变。 使用 CsvHelper 27.1.1,这可行:

      var csvConfig = new CsvHelper.Configuration.CsvConfiguration(CultureInfo.CurrentCulture)
      {
          ShouldQuote = args => false
      };
      
      using var fs = new StreamWriter("data.csv");
      using var writer = new CsvWriter(fs, csvConfig);
      

      不幸的是,该库的文档记录很差。我已经从这个问题中弄清楚了:https://github.com/JoshClose/CsvHelper/issues/1726

      【讨论】:

        猜你喜欢
        • 2014-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-19
        • 2020-10-15
        • 2014-08-14
        • 1970-01-01
        相关资源
        最近更新 更多