如何使用CSVhelper库遍历csv文件中的列?使用: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或0,我如何查找该值

注意:

  • 我不想要整列的值,因为该列中的所有值都是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:temptest.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:temptest.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

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

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

最新更新