繁体   English   中英

如何使用 CSVhelper 库遍历 csv 文件中的列? 使用:动态 object

[英]How to iterate through a column in a csv file using CSVhelper library? using: dynamic object

CSV 文件

记事本编辑器中的 CSV 文件

using CsvHelper;

public class csvread
{
   public dynamic APSSValue ;
   public async Task GetMode()
   {
      try 
      {
         FileOpenPicker openpicker = new FileOpenPicker();
         openpicker.FileTypeFilter.Add(".csv");   
         IRandomAccessStreamWithContentType stream = await file.OpenReadAsync();
         StreamReader reader = new StreamReader(stream.AsStream());
         string UserCultureInfo = Thread.CurrentThread.CurrentCulture.Name;
         CsvReader csv = new CsvReader(reader, culture: CultureInfo.CreateSpecificCulture(UserCultureInfo));
         csv.Configuration.HasHeaderRecord = false;
         csv.Configuration.Delimiter = ";";
         while (csv.Read())
         {
            APSSValue = Enumerable.ToList(csv.GetRecord<dynamic>());
         }
      }
   }
}

我尝试了上面显示的这种方式,但这样我只能得到列数。 我也试过

csv.Read();
APSSValue = Enumerable.ToList(csv.GetRecords<dynamic>());

但这给了我 csv 文件的全部数据。

问题:

  • 我想在(I_APSS_Modus)列下查找值请参阅上面共享的图像,它可以是 0 或 1,那么如果它是 0 或 1,我该如何查找该值?

笔记:

  • 我不想要整列的值,因为列中的所有值都是 0 或 1。所以我只想要该列下任何行的一个值。

  • CSV 文件每次都不相同,因此如果 CSV 文件不同, (I_APSS_Modus)的列号会有所不同

尝试以下将数据放入 DataTable 的代码,以便您可以轻松地使用 linq 进行过滤。 下面将与发布的 csv 一起使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Globalization;
using System.Data;

namespace ConsoleApplication8
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add("Timestamp", typeof(DateTime));
            dt.Columns.Add("B_Kurze_Seite", typeof(Boolean));
            dt.Columns.Add("I_Partikeleinfall Reinluft", typeof(int));
            dt.Columns.Add("I_Partikeleinfall Rohluft", typeof(int));
            dt.Columns.Add("I_APSS_Modus", typeof(int));

            StreamReader reader = new StreamReader(FILENAME);
            string line = "";
            int row = 0;
            string format = "yyyy MM dd HH:mm:ss:fff";
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if (line.Length > 0 && !line.StartsWith("sep"))
                {
                    if (++row > 1)
                    {
                        string[] splitRow = line.Split(new char[] { ';' });
                        dt.Rows.Add(new object[] {
                        DateTime.ParseExact(splitRow[0],format,CultureInfo.InvariantCulture),
                        (splitRow[1] == "FALSE")? false : true,
                        int.Parse(splitRow[2]),
                        int.Parse(splitRow[3]),
                        int.Parse(splitRow[4])
                    });
                    }

                }
            }
            List<int> data = dt.AsEnumerable().Select(x => x.Field<int>("I_APSS_Modus")).ToList();
        }
    }

}

这是适用于通用列的代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Globalization;
using System.Data;

namespace ConsoleApplication8
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.txt";
        static void Main(string[] args)
        {
            DataTable dt = new DataTable();


            StreamReader reader = new StreamReader(FILENAME);
            string line = "";
            int row = 0;
            string format = "yyyy MM dd HH:mm:ss:fff";
            string[] columnNames = null;
            while ((line = reader.ReadLine()) != null)
            {
                line = line.Trim();
                if ((line.Length > 0) && !line.StartsWith("sep"))
                {
                    string[] splitRow = line.Split(new char[] { ';' });
                    if (++row == 1)
                    {
                        columnNames = splitRow;
                        foreach (string col in splitRow)
                        {
                            switch(col)
                            {
                                case "Timestamp":
                                    dt.Columns.Add(col, typeof(DateTime));
                                    break;

                                case "I_APSS_Modus":
                                    dt.Columns.Add(col, typeof(int));
                                    break;

                                default:
                                    dt.Columns.Add(col, typeof(string));
                                    break;
                            }
                        }
                    }
                    else
                    {
                        DataRow newRow = dt.Rows.Add();
                        for (int i = 0; i < columnNames.Length; i++)
                        {
                            switch (columnNames[i])
                            {
                                case "Timestamp":
                                    newRow["Timestamp"] =  DateTime.ParseExact(splitRow[i], format, CultureInfo.InvariantCulture);
                                    break;

                                case "I_APSS_Modus":
                                     newRow["I_APSS_Modus"] = int.Parse(splitRow[i]);
                                    break;

                                default:
                                    newRow[i] = splitRow[i];
                                    break;
                            }
                        }
                    }

                }
            }
            List<int> data = dt.AsEnumerable().Select(x => x.Field<int>("I_APSS_Modus")).ToList();
        }
    }
 
}

如果你想继续使用 CsvHelper,一个简单的映射应该可以解决问题:

// Data model of a row (only I_APSS_Modul is of interest)
public class DataSet
{
    public int ApssModus { get; set; }
}

// Mapping
public class ApssMap : ClassMap<DataSet>
{
    public ApssMap()
    {
        Map(m => m.ApssModus).Name("I_APSS_Modus");
    }
}

// Reading records
public void GetMode()
{
    
    string UserCultureInfo = Thread.CurrentThread.CurrentCulture.Name;

    using (var tr = new StreamReader(new FileStream("any.csv", FileMode.Open)))
    {
        using (var csv = new CsvReader(tr, new CsvConfiguration(CultureInfo.CreateSpecificCulture(UserCultureInfo))
        {
            Delimiter = ";"
        }))
        {

            csv.Configuration.RegisterClassMap<ApssMap>();
            var records = csv.GetRecords<DataSet>().ToList();
        }
    }
}

编辑:检查所有映射选项的官方文档: https://joshclose.github.io/CsvHelper/examples/configuration/class-maps

如果只想读取第一行数据,则必须先读取 header,然后才能读取第一行数据。

static void Main(string[] args)
{
    using (var stream = new MemoryStream())
    using (var writer = new StreamWriter(stream))
    using (var reader = new StreamReader(stream))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        writer.WriteLine("Timestamp;B_Kurze_Seite;I_Parikeleinfall Reinluft;I_Partikeleinfall Rohluft;I_APSS_Modus");
        writer.WriteLine("2020 06 27 08:49:20:335;FALSE;15;0;0");
        writer.WriteLine("2020 06 27 08:49:20:391;FALSE;0;0;0");
        writer.Flush();
        stream.Position = 0;

        csv.Configuration.Delimiter = ";";

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

        csv.Read();
        var record = csv.GetRecord<dynamic>();

        var APSSModus = record.I_APSS_Modus;
    }
}

编辑:这应该给你与@jdweng 相同的答案

static void Main(string[] args)
{
    using (var stream = new MemoryStream())
    using (var writer = new StreamWriter(stream))
    using (var reader = new StreamReader(stream))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        writer.WriteLine("sep=;");
        writer.WriteLine("");
        writer.WriteLine("");
        writer.WriteLine("");
        writer.WriteLine("Timestamp;B_Kurze_Seite;I_Parikeleinfall Reinluft;I_Partikeleinfall Rohluft;I_APSS_Modus");
        writer.WriteLine("2020 06 27 08:49:20:335;FALSE;15;0;0");
        writer.WriteLine("2020 06 27 08:49:20:391;FALSE;0;0;0");
        writer.Flush();
        stream.Position = 0;

        csv.Configuration.Delimiter = ";";

        csv.Configuration.ShouldSkipRecord = row => row[0].StartsWith("sep=") || row.All(string.IsNullOrEmpty);

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

        List<int> data = records.Select(x => (int)int.Parse(x.I_APSS_Modus)).ToList();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM