使用 С# CSVHELPER 从 CSV 获取值时,代码重复

Posted

技术标签:

【中文标题】使用 С# CSVHELPER 从 CSV 获取值时,代码重复【英文标题】:The code is duplicated when getting values from CSV with С# CSVHELPER 【发布时间】:2021-10-02 17:11:18 【问题描述】:

读取 CSV 时,方法中的代码重复。如何删除重复项以及为什么会出现?在没有它们的情况下写入 CSV,但在读取时会开始重复:

方法:

public class Program


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

        public Product(int id, string name)
        
            Id = id;
            Name = name;
        
    

    public static void Main(string[] args)
    
        Research();
    

    public static void Research()
    

            using (var writer = new StreamWriter("C:\\Users\\Saint\\Desktop\\TaskRetail\\file.csv", false, Encoding.UTF8))
            using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
            
                csv.WriteRecords(products);
            

            var config = new CsvConfiguration(CultureInfo.InvariantCulture) 
             
            Delimiter = ",",
            PrepareHeaderForMatch = header => header.Header.ToLower()
            ;

            using (var reader = new StreamReader("C:\\Users\\Saint\\Desktop\\TaskRetail\\file.csv", Encoding.UTF8))
            using (var csv = new CsvReader(reader, config))

            
                var records = csv.GetRecords<Product>();

                foreach (var record in records)
                
                    Console.WriteLine($"record.Id record.Name");
               
            
        
    

输出到控制台:

【问题讨论】:

你能提供csv本身吗? 我不知道如何做得更好。我应该发送屏幕截图吗? 能否请您edit 分享一个minimal reproducible example -- 代码和CSV 数据作为文本,我们可以用来重现您的问题?请不要将 CSV 或任何其他文本数据作为屏幕截图共享,请参阅 Why not upload images of code/errors when asking a question? 和 Discourage screenshots of code and/or errors 了解原因。 如何创建您的products?我猜问题就在那里。我可以创建一个产品列表,您的代码可以正常工作,没有任何重复。 @OttoRahn 取决于数据的敏感程度。例如,您可以将其作为要点上传到 github。 【参考方案1】:

问题是您在创建产品的循环中包含了 CSV 文件的写入和读取。您的第一个产品已创建,它被写入 CSV 文件,然后被读取并打印到您的控制台。循环继续并创建您的第二个产品。产品 1 和产品 2 被写入 CSV 文件,然后它们都从 CSV 文件中读取并打印到您的控制台。这对于创建的每个产品都会继续,这就是您在控制台中显示重复项的原因。在写信给file.csv之前,您需要关闭for 循环

for (var i = 0; i < count; i++)

    var element = xmlDoc.Item(i);
    var id = int.Parse(element.Attributes.GetNamedItem("id").Value);
    var name = element.SelectSingleNode("name").InnerText;
    var product = new Product(id, name);
    //Console.WriteLine($"Id: id, name: name");

    products.Add(product);

 // Close your loop here!!

using (var writer = new StreamWriter("C:\\Users\\Saint\\Desktop\\TaskRetail\\file.csv", false, Encoding.UTF8))
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))

    csv.WriteRecords(products);

【讨论】:

以上是关于使用 С# CSVHELPER 从 CSV 获取值时,代码重复的主要内容,如果未能解决你的问题,请参考以下文章

使用 CsvHelper 将 CSV 文件中的编号列映射到数组

如何将 EnumConverter 与 CsvHelper 一起使用

将值转换为 int

使用 CsvHelper 时转换为十进制

使用 CSVhelper 将单个列更新为先前编写的 CSV 文件。我有 Java 代码,但无法将其翻译成 C#

使用 CsvHelper 读取多头 CSV 文件