Как выполнить итерацию по столбцу в файле CSV с помощью библиотеки CSVhelper? используя: объект Dynami c - PullRequest
0 голосов
/ 09 июля 2020

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 не всегда одинаков, поэтому номер столбца для (I_APSS_Modus) будет отличаться, если файл CSV отличается

Ответы [ 3 ]

0 голосов
/ 09 июля 2020

Если вы хотите остаться с 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();
        }
    }
}

Edit : проверьте официальные документы для всех параметров сопоставления: https://joshclose.github.io/CsvHelper/examples/configuration/class-maps

0 голосов
/ 09 июля 2020

Если вы просто хотите прочитать первую строку данных, вам нужно сначала прочитать заголовок, а затем вы можете прочитать первую строку данных.

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();
    }
}
0 голосов
/ 09 июля 2020

Попробуйте следующий код, который помещает данные в 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();
        }
    }

}

Вот код, который будет работать с общими c столбцами

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();
        }
    }
 
}
...