Ich versuche, zwei Arten von Datensätzen aus einer CSV mit der folgenden Struktur-Datei zu lesen:CsvHelper - Lesen Sie verschiedene Datensatztypen in gleichen CSV
PlaceName,Longitude,Latitude,Elevation
NameString,123.456,56.78,40
Date,Count
1/1/2012,1
2/1/2012,3
3/1/2012,10
4/2/2012,6
ich diese Frage wissen, wurde in
vorher abgedecktaber Wenn ich meine Implementierung ausführen, erhält es eine CsvMissingFieldException
, die besagt, dass Fields 'Date' do not exist in the CSV file
. Ich habe zwei Definition und Karten Klassen, eine für den Standort und die andere für den Grafen, die da sind:
public class LocationDefinition
{
public string PlaceName { get; set; }
public double Longitude { get; set; }
public double Latitude { get; set; }
public double Elevation { get; set; }
}
public sealed class LocationMap : CsvClassMap<LocationDefinition>
{
public LocationMap()
{
Map(m => m.PlaceName).Name("PlaceName");
Map(m => m.Longitude).Name("Longitude");
Map(m => m.Latitude).Name("Latitude");
Map(m => m.Elevation).Name("Elevation");
}
}
public class CountDefinition
{
public DateTime Date { get; set; }
public int Count { get; set; }
}
public sealed class CountMap : CsvClassMap<CountDefinition>
{
public CountMap()
{
Map(m => m.Date).Name("Date");
Map(m => m.Count).Name("Count");
}
}
Der Code, den ich zum Lesen der CSV-Datei haben, ist:
LocationDefinition Location;
var Counts = new List<CountDefinition>();
using (TextReader fileReader = File.OpenText(@"Path\To\CsvFile"))
using (var csvReader = new CsvReader(fileReader))
{
csvReader.Configuration.RegisterClassMap<LocationMap>();
csvReader.Configuration.RegisterClassMap<CountMap>();
// Only reads a single line of Location data
csvReader.Read();
LocationData = csvReader.GetRecord<LocationDefinition>();
csvReader.Read(); // skip blank line
csvReader.Read(); // skip second header section
// Read count data records
while (csvReader.Read())
{
var tempCount = csvReader.GetRecord<CountDefinition>();
Counts.Add(tempCount);
}
}
Die Ausnahme wird auf die Linie geworfen. Von dem, was ich sagen kann, erwartet es immer noch einen Standortdatensatz, aber ich hätte gedacht, GetRecord<CountDefinition>
würde den Datensatztyp angeben. Ich habe auch versucht, ClearRecordCache
und die Registrierung der LocationMap
vergeblich.
Wie sollte dieser Code geändert werden, damit er eine CSV-Datei dieser Struktur liest?
Wiederholt sich die Struktur? Können Sie mehr als eine Struktur buchen? Seit 40 Jahren fils fils wie dies zu analysieren und kann leicht eine großartige Lösung geben. – jdweng
Der Standortbereich tritt nur einmal auf und befindet sich vor dem Zählabschnitt (derzeit hat er nur einen Datensatz), der Zählabschnitt kann eine beliebige Anzahl von Datensätzen haben. Es könnte sich lohnen, den Code in die Lage zu versetzen, eine beliebige Anzahl von Standortdatensätzen zu verarbeiten. – Ayb4btu
Ich würde die Datei in zwei teilen, wo die CRLF erscheint. Sobald der Ort def initialisiert ist, kann ich ihn nicht loslassen. – Plutonix