将值转换为 int

Posted

技术标签:

【中文标题】将值转换为 int【英文标题】:Convert value to int 【发布时间】:2021-11-04 02:56:07 【问题描述】:

我正在尝试使用 CsvHelper 转换 CSV 文件中的值。该值本身是一个整数,但 csv 中的值包含一个空格,例如“0”或“12”。

我怎样才能让它现在工作?在 *** 上,我找到了这个线程,但修剪不适用于绑定。根据该库创建者的评论,它应该从 V2.9.0 开始。

How do you ignore Whitespace when using CsvHelper, CsvReader.Read()?

我尝试以这种方式读取我的 CSV:

using (TextReader reader = new StreamReader(datei))

    CsvConfiguration configuration = new CsvConfiguration(CultureInfo.GetCultureInfo("de-DE"));
    configuration.BadDataFound = null;
    configuration.TrimOptions = TrimOptions.Trim;
    

    using (var csv = new CsvReader(reader, configuration))
    
        ArtikeldatenLieferant = csv.GetRecords<AllnetArtikel>().ToList();
    

编辑:

这是导致此问题的 CSV 中的一行:

Nr.;ALLNET-Artikelnummer;Hersteller-Artikelnummer;Hersteller;Produktbezeichnung;EAN Nummer;Kategorieebene1;Kategorieebene2;Kategorieebene3;HEK;Artikelzustand;UVP;Produktbeschreibung;Gewicht;Lagerbestand 
9234;193301;AL-MSUC-SUF-S;Audiocodes Live;Audiocodes Live - AL-MSUC-SUF-S;;Telekommunikation;Voice over IP;Voice over IP - Gateway Support;2739,13;neu;3043,48;"AudioCodes Live non-recurring setup fee, for each customer site with up to 500 users. Includes delivery, Planning and Design consulting service, Implementation service (configuration and basic verification) for AudioCodes hardware or software, and cutover support into production for a single event. Does not include Project Management.;0,001;0 

Edit2:这是 AllnetArtikel 类。

public class AllnetArtikel
    
        
        [Name("Nr.")]
        public string Nr  get; set;  = string.Empty;
        [Name("ALLNET-Artikelnummer")]
        public string AllnetArtiNr get; set;  = string.Empty;
        [Name("Hersteller-Artikelnummer")]
        public string HerstellerArtiNr get; set;  = string.Empty;
        [Name("Hersteller")]
        public string Hersteller get; set;  = string.Empty;
        [Name("Produktbezeichnung")]
        public string Produktbezeichnung get; set;  = string.Empty;
        [Name("EAN Nummer")]
        public string EAN get; set;  = string.Empty;
        [Name("Kategorieebene1")]
        public string Kategorie1 get; set;  = string.Empty;
        [Name("Kategorieebene2")]
        public string Kategorie2 get; set;  = string.Empty;
        [Name("Kategorieebene3")]
        public string Kategorie3 get; set;  = string.Empty;
        [Name("HEK")]
        public decimal HEK get; set; 
        [Name("Artikelzustand")]
        public string Zustand get; set;  = string.Empty;
        [Name("UVP")]
        public decimal UVP get; set; 
        [Name("Produktbeschreibung")]
        public string Produktbeschreibung get; set;  = string.Empty;
        [Name("Gewicht")]
        [Default(-1)]
        public decimal Gewicht get; set; 
        [Name("Lagerbestand")]
        public int Lagerbestand  get; set;  
    

【问题讨论】:

joshclose.github.io/CsvHelper/examples/configuration/class-maps/…加胡椒和盐调味 【参考方案1】:

最终更新

问题最终是字段中的引用,并且引用未转义或包含在引号中的字段。 ;"AudioCodes ... Management.;。由于引用是所需数据的一部分,因此解决方案是将配置模式更改为NoEscape。 This mode will ignore quotes and escape characters.

configuration.Mode = CsvMode.NoEscape;

更新

任何与int.Parse 一起使用的字符串都应该与CsvHelper 一起使用。例如int.Parse("0 ") == 0。由于有额外的空格不是问题,并且当您将整数字段更改为字符串时它会起作用,所以我猜测您的问题实际上是一个空值。 CsvHelper 无法将任何空值转换为 int。如果是这种情况,您有两个选择。

将您的整数字段转换为Nullable&lt;int&gt;

void Main()

    CsvConfiguration configuration = new CsvConfiguration(CultureInfo.GetCultureInfo("de-DE"));

    using (var reader = new StringReader("Id;Name\n1;Joe\n;Jenny"))
    using (var csv = new CsvReader(reader, configuration))
    
        var records = csv.GetRecords<Foo>().ToList().Dump();
    


public class Foo

    public int? Id  get; set; 
    public string Name  get; set; 

或者给你的整数字段一个默认值。

void Main()

    CsvConfiguration configuration = new CsvConfiguration(CultureInfo.GetCultureInfo("de-DE"));

    using (var reader = new StringReader("Id;Name\n1;Joe\n;Jenny"))
    using (var csv = new CsvReader(reader, configuration))
    
        var records = csv.GetRecords<Foo>().ToList().Dump();
    


public class Foo

    [Default(0)]
    public int Id  get; set; 
    public string Name  get; set; 

原创

您确定您没有因其他原因获得例外吗?我可以在数字后添加任意数量的空格,它仍然可以正确读取。

void Main()

    CsvConfiguration configuration = new CsvConfiguration(CultureInfo.GetCultureInfo("de-DE"));
    
    using (var reader = new StringReader("Id;Name\n1    ;Joe\n10 ;Jenny"))
    using (var csv = new CsvReader(reader, configuration))
    
        var records = csv.GetRecords<Foo>().ToList();
       


public class Foo

    public int Id  get; set; 
    public string Name  get; set; 

【讨论】:

是的。当我将整数字段更改为字符串时,它可以完美运行。修剪选项也会修剪我的价值,但它不允许我让它为 int 工作 由于它在您将整数字段更改为字符串时起作用,我认为您的问题实际上可能与空值有关。您可能会收到一条错误消息,例如“无法执行转换。文本:'' MemberType: System.Int32” 如果您注意到Text: '',这意味着它正在尝试转换空字符串。如果这确实是问题,我添加了关于如何处理的答案。 嗨,大卫,不,文本:'' 部分是 MARKERSPACE 那听起来像你的问题。 CsvHelper 无法将“MARKERSPACE”转换为 int。 configuration.Mode = CsvMode.NoEscape 正是我正在搜索的内容。现在可以了。 ;)

以上是关于将值转换为 int的主要内容,如果未能解决你的问题,请参考以下文章

将 JSON 对象脱盐到数据表时将值“1D”转换为类型“System.Int64”时出错

如何在聚合之前将值转换为 long?

我需要将值存储到int类型的变量,但int是不够的?

SQL如何将值放在一行

python中 列表导入到字典 出现相同的键,如何将值相加

将值从 JsonObject 转换为 BigDecimal