Lettura del file CSV e memorizzazione dei valori in un array


317

Sto cercando di leggere un *.csvfile.

Il *.csvfile è costituito da due colonne separate da punto e virgola (" ; ").

Sono in grado di leggere il *.csvfile usando StreamReader e di separare ogni riga usando la Split()funzione. Voglio memorizzare ogni colonna in un array separato e quindi visualizzarlo.

è possibile farlo?


2
@Marc: sfortunatamente nelle culture non inglesi (es. Italiano) quando si salva un Excel in CSV, questo viene usato ";"come separatore ... questo ha reso CSV un imo non standard :(
digEmAll

25
Ho sempre letto CSV come valori separati da caratteri poiché le persone chiamano file CSV anche se non usano una virgola come separatore. E ci sono così tanti dialetti con regole di citazione o di escape diverse nella pratica che non si può davvero parlare di uno standard anche se in teoria esiste un RFC.
Codici

1
Il nome dell'estensione del file CSV ora dovrebbe essere modificato in DSV - File dei valori separati dal delimitatore
Ambuj,

Per tutte le risposte che dividono semplicemente la stringa sul carattere delimitatore, questo non è il modo migliore di procedere. Ci sono più regole nel formato CSV che questo non tratterà. È preferibile utilizzare un parser di terze parti. Maggiori informazioni- dotnetcoretutorials.com/2018/08/04/csv-parsing-in-net-core
iliketocode

Risposte:


415

Puoi farlo in questo modo:

using System.IO;

static void Main(string[] args)
{
    using(var reader = new StreamReader(@"C:\test.csv"))
    {
        List<string> listA = new List<string>();
        List<string> listB = new List<string>();
        while (!reader.EndOfStream)
        {
            var line = reader.ReadLine();
            var values = line.Split(';');

            listA.Add(values[0]);
            listB.Add(values[1]);
        }
    }
}

5
Grazie per questo, avevo dimenticato come dividere le linee in un file CSV (stupido!) Ma la tua soluzione mi ha aiutato :)
Hallaghan,

4
Sono trascorsi più di 3 anni e questa domanda aiuta ancora qualcuno. Mi dispiace che tu non abbia accettato.
AdamMc331,

12
Non gestisce i valori di campo con virgole, ecc.
Mike,

12
Dovranno utilizzare una usingclausola di qui, o per lo meno manualmente Close()il readerdato che è una IDisposiblerisorsa.
Assaf Israele,

30
Anche questo non analizzerà correttamente un CSV scritto come column1;"Special ; char in string";column3- tools.ietf.org/html/rfc4180
Ole K

173

Il mio parser CSV preferito è quello incorporato nella libreria .NET. Questo è un tesoro nascosto nello spazio dei nomi Microsoft.VisualBasic. Di seguito è riportato un codice di esempio:

using Microsoft.VisualBasic.FileIO;

var path = @"C:\Person.csv"; // Habeeb, "Dubai Media City, Dubai"
using (TextFieldParser csvParser = new TextFieldParser(path))
{
 csvParser.CommentTokens = new string[] { "#" };
 csvParser.SetDelimiters(new string[] { "," });
 csvParser.HasFieldsEnclosedInQuotes = true;

 // Skip the row with the column names
 csvParser.ReadLine();

 while (!csvParser.EndOfData)
 {
  // Read current line fields, pointer moves to the next line.
  string[] fields = csvParser.ReadFields();
  string Name = fields[0];
  string Address = fields[1];
 }
}

Ricorda di aggiungere riferimento a Microsoft.VisualBasic

Maggiori dettagli sul parser sono forniti qui: http://codeskaters.blogspot.ae/2015/11/c-easiest-csv-parser-built-in-net.html


6
Mi piace questa opzione la migliore. Non devo preoccuparmi dei caratteri di escape poiché la classe è un parser CSV e non qualcosa che viene creato manualmente.
Timothy Gonzalez,

22
Nel caso in cui qualcuno si imbatta in questo e si chieda, sarà necessario includere il riferimento Microsoft.VisualBasicall'assemblaggio del framework in quanto non viene generalmente indicato come impostazione predefinita.
apokryfos,

3
Vorrei averlo ricordato dai miei giorni VB6, mi avrebbe risparmiato molto tempo nel corso degli anni. Mentre alcuni venereranno su VB, non ho problemi ad aggiungere la dll & namespace al mio codice se ha valore. Questo ha MOLTO valore.
Walter,

2
Questa soluzione è un homerun. parser molto affidabile dalla mia esperienza.
Glenn Ferrie,

3
Perché solo in VB dll?
Mark Choi il

75

Modo LINQ:

var lines = File.ReadAllLines("test.txt").Select(a => a.Split(';'));
var csv = from line in lines
          select (from piece in line
                  select piece);

^^ Sbagliato - Modifica di Nick

Sembra che il risponditore originale stesse tentando di popolare csvun array bidimensionale, un array contenente array. Ogni elemento nel primo array contiene un array che rappresenta quel numero di riga con ciascun elemento nell'array nidificato contenente i dati per quella specifica colonna.

var csv = from line in lines
          select (line.Split(',')).ToArray();

2
Forse mi manca qualcosa, ma non sono sicuro di quale sia il punto della tua variabile CSV: non stai solo ricreando la stessa struttura di dati che è spiegata nelle righe?
Ben Hughes,

13
@ClayShannon .NET 1.1? Sono ... molto dispiaciuto per te.
contactmatt

5
@contactmatt: non ti disonorerò di quel sentimento.
B. Clay Shannon,

9
Voglio anche sottolineare che i CSV possono essere citati ... Quindi usare string.Split non è un'opzione praticabile.
Alxandr,

5
Sto ottenendo: 'System.Array' non contiene una definizione per 'Split' e non è stato trovato alcun metodo di estensione 'Split' che accetta un primo argomento di tipo 'System.Array' (ti manca una direttiva che utilizza o un riferimento di assembly ?)
Kala J,

36

Non è possibile creare immediatamente un array perché è necessario conoscere il numero di righe dall'inizio (e ciò richiederebbe di leggere due volte il file CSV)

È possibile memorizzare i valori in due List<T>e quindi usarli o convertirli in un array utilizzandoList<T>.ToArray()

Esempio molto semplice:

var column1 = new List<string>();
var column2 = new List<string>();
using (var rd = new StreamReader("filename.csv"))
{
    while (!rd.EndOfStream)
    {
        var splits = rd.ReadLine().Split(';');
        column1.Add(splits[0]);
        column2.Add(splits[1]);
    }
}
// print column1
Console.WriteLine("Column 1:");
foreach (var element in column1)
    Console.WriteLine(element);

// print column2
Console.WriteLine("Column 2:");
foreach (var element in column2)
    Console.WriteLine(element);

NB

Si noti che questo è solo un esempio molto semplice . L'uso string.Splitnon tiene conto dei casi in cui alcuni record contengono il separatore ;al suo interno.
Per un approccio più sicuro, considera l'utilizzo di alcune librerie specifiche per CSV come CsvHelper su nuget.


Non tiene conto di ;far parte del valore, ad esempio "value with ; inside it". Valori surround CSV contenenti caratteri speciali con virgolette doppie per dire che è una stringa letterale.
ChickenFeet

1
@ChickenFeet: certo, questo è il motivo della didascalia: "Esempio molto semplice" . Comunque posso aggiungere una nota a riguardo;)
digEmAll

Nessun problema, ho notato che molte altre risposte qui non ne tengono conto :)
ChickenFeet

1
Regex.Split (sr.ReadLine (), ", (? = (?: [^ \"] * \ "[^ \"] * \ ") * [^ \"] * $) "); // Trovato questo su SO ... più veloce di una biblioteca.
Pizzica il

34

Mi sono appena imbattuto in questa libreria: https://github.com/JoshClose/CsvHelper

Molto intuitivo e facile da usare. Ha anche un pacchetto nuget che ha reso veloce l'implementazione: http://nuget.org/packages/CsvHelper/1.17.0 . Sembra anche essere attivamente mantenuto che mi piace.

Configurarlo per utilizzare un punto e virgola è semplice: https://github.com/JoshClose/CsvHelper/wiki/Custom-Configurations


3
Questa è la risposta migliore! Libreria robusta facile da inserire e utilizzare.
Tyler Forsythe,

3
La libreria CsvHelper è fantastica. Super veloce e facile da usare.
Steve Parish,

3
Se stai cercando una libreria in grado di gestire tutti gli aspetti del formato CSV, comprese le stringhe tra virgolette, usa questa. Eccezionale!
Matt,

Grazie, libreria davvero bella, facile da usare e molto robusta.
Sebastián Guerrero,

2
Come si confronta la prestazione Microsoft.VisualBasic.FileIO.TextFieldParser(vedi la risposta di @ Habeeb)?
bovender

33

Di solito uso questo parser da codeproject , dal momento che ci sono un sacco di fughe di caratteri e simili che gestisce per me.


2
questa cosa è molto buona e veloce. Se ti trovi in ​​una situazione aziendale e hai bisogno di fare crack, usa questo.
gjvdkamp,

8
Questo parser è disponibile nella galleria Nuget come LumenWorks.Framework.IO, nel caso in cui non si desideri registrarsi a CodeProject per scaricarlo.
Greg McCoy,

30

Ecco la mia variazione della risposta più votata:

var contents = File.ReadAllText(filename).Split('\n');
var csv = from line in contents
          select line.Split(',').ToArray();

La csvvariabile può quindi essere utilizzata come nell'esempio seguente:

int headerRows = 5;
foreach (var row in csv.Skip(headerRows)
    .TakeWhile(r => r.Length > 1 && r.Last().Trim().Length > 0))
{
    String zerothColumnValue = row[0]; // leftmost column
    var firstColumnValue = row[1];
}

Come si accede alle righe e alle colonne nella variabile CSV?
Matthew Lock,

1
come gestisci la virgola di escape?
Kuangwei Zhang,

Non gestisce le virgole all'interno delle colonne. Meglio usare la robusta libreria CsvHelper secondo la risposta
Tim Partridge,

11

Se devi saltare le righe (head-) e / o le colonne, puoi usarlo per creare un array bidimensionale:

    var lines = File.ReadAllLines(path).Select(a => a.Split(';'));
    var csv = (from line in lines               
               select (from col in line
               select col).Skip(1).ToArray() // skip the first column
              ).Skip(2).ToArray(); // skip 2 headlines

Ciò è abbastanza utile se è necessario modellare i dati prima di elaborarli ulteriormente (supponendo che le prime 2 righe siano costituite dal titolo e la prima colonna sia un titolo di riga - che non è necessario avere nell'array perché voglio considerare i dati).

NB Puoi facilmente ottenere i titoli e la prima colonna usando il seguente codice:

    var coltitle = (from line in lines 
                    select line.Skip(1).ToArray() // skip 1st column
                   ).Skip(1).Take(1).FirstOrDefault().ToArray(); // take the 2nd row
    var rowtitle = (from line in lines select line[0] // take 1st column
                   ).Skip(2).ToArray(); // skip 2 headlines

Questo esempio di codice presuppone la seguente struttura del *.csvfile:

Matrice CSV

Nota: se devi saltare le righe vuote, cosa che può essere utile a volte, puoi farlo inserendo

    where line.Any(a=>!string.IsNullOrWhiteSpace(a))

tra la frome la selectdichiarazione negli esempi di codice LINQ sopra.


10

È possibile utilizzare Microsoft.VisualBasic.FileIO.TextFieldParser dll in C # per prestazioni migliori

ottenere sotto l'esempio di codice dall'articolo precedente

static void Main()
{
    string csv_file_path=@"C:\Users\Administrator\Desktop\test.csv";

    DataTable csvData = GetDataTabletFromCSVFile(csv_file_path);

    Console.WriteLine("Rows count:" + csvData.Rows.Count);

    Console.ReadLine();
}


private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
{
    DataTable csvData = new DataTable();

    try
    {

    using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
        {
            csvReader.SetDelimiters(new string[] { "," });
            csvReader.HasFieldsEnclosedInQuotes = true;
            string[] colFields = csvReader.ReadFields();
            foreach (string column in colFields)
            {
                DataColumn datecolumn = new DataColumn(column);
                datecolumn.AllowDBNull = true;
                csvData.Columns.Add(datecolumn);
            }

            while (!csvReader.EndOfData)
            {
                string[] fieldData = csvReader.ReadFields();
                //Making empty value as null
                for (int i = 0; i < fieldData.Length; i++)
                {
                    if (fieldData[i] == "")
                    {
                        fieldData[i] = null;
                    }
                }
                csvData.Rows.Add(fieldData);
            }
        }
    }
    catch (Exception ex)
    {
    }
    return csvData;
}

9
Non è così efficiente perché Split non fa tutto ciò che fa TextFieldParser. Ad esempio, saltare le righe di commento, gestire i campi tra virgolette e rimuovere gli spazi bianchi iniziali / finali. Non esattamente un confronto 1: 1.
Robert McKee,

5

Ciao a tutti, ho creato una classe statica per farlo. + controllo colonna + rimozione del segno di quota

public static class CSV
{
    public static List<string[]> Import(string file, char csvDelimiter, bool ignoreHeadline, bool removeQuoteSign)
    {
        return ReadCSVFile(file, csvDelimiter, ignoreHeadline, removeQuoteSign);
    }

    private static List<string[]> ReadCSVFile(string filename, char csvDelimiter, bool ignoreHeadline, bool removeQuoteSign)
    {
        string[] result = new string[0];
        List<string[]> lst = new List<string[]>();

        string line;
        int currentLineNumner = 0;
        int columnCount = 0;

        // Read the file and display it line by line.  
        using (System.IO.StreamReader file = new System.IO.StreamReader(filename))
        {
            while ((line = file.ReadLine()) != null)
            {
                currentLineNumner++;
                string[] strAr = line.Split(csvDelimiter);
                // save column count of dirst line
                if (currentLineNumner == 1)
                {
                    columnCount = strAr.Count();
                }
                else
                {
                    //Check column count of every other lines
                    if (strAr.Count() != columnCount)
                    {
                        throw new Exception(string.Format("CSV Import Exception: Wrong column count in line {0}", currentLineNumner));
                    }
                }

                if (removeQuoteSign) strAr = RemoveQouteSign(strAr);

                if (ignoreHeadline)
                {
                    if(currentLineNumner !=1) lst.Add(strAr);
                }
                else
                {
                    lst.Add(strAr);
                }
            }

        }

        return lst;
    }
    private static string[] RemoveQouteSign(string[] ar)
    {
        for (int i = 0;i< ar.Count() ; i++)
        {
            if (ar[i].StartsWith("\"") || ar[i].StartsWith("'")) ar[i] = ar[i].Substring(1);
            if (ar[i].EndsWith("\"") || ar[i].EndsWith("'")) ar[i] = ar[i].Substring(0,ar[i].Length-1);

        }
        return ar;
    }

}

4
var firstColumn = new List<string>();
var lastColumn = new List<string>();

// your code for reading CSV file

foreach(var line in file)
{
    var array = line.Split(';');
    firstColumn.Add(array[0]);
    lastColumn.Add(array[1]);
}

var firstArray = firstColumn.ToArray();
var lastArray = lastColumn.ToArray();

Grazie per l'aiuto. Potrebbe aiutare a risolvere il mio problema. In realtà devo leggere i dati dal file e quindi inserirli nel database. Al momento dell'inserimento, visualizzo l'errore di vincolo della chiave primaria (poiché ho già dei dati nel database). Quindi, devo programmare in modo tale che con la variabile già esiste quindi aggiornare i dati.
Rushabh Shah,

Presumo il primo valore se PK - è necessario ottenere un record per ID dal database e se esiste oltre a rilasciare un'istruzione UPDATE, altrimenti inserire un nuovo record.
Jakub Konecki,

3

Ecco un caso speciale in cui uno dei campi di dati ha punto e virgola (";") come parte dei suoi dati in quel caso la maggior parte delle risposte sopra fallirà.

Soluzione che sarà quel caso

string[] csvRows = System.IO.File.ReadAllLines(FullyQaulifiedFileName);
string[] fields = null;
List<string> lstFields;
string field;
bool quoteStarted = false;
foreach (string csvRow in csvRows)
{
    lstFields = new List<string>();
    field = "";
    for (int i = 0; i < csvRow.Length; i++)
    {
        string tmp = csvRow.ElementAt(i).ToString();
        if(String.Compare(tmp,"\"")==0)
        {
            quoteStarted = !quoteStarted;
        }
        if (String.Compare(tmp, ";") == 0 && !quoteStarted)
        {
            lstFields.Add(field);
            field = "";
        }
        else if (String.Compare(tmp, "\"") != 0)
        {
            field += tmp;
        }
    }
    if(!string.IsNullOrEmpty(field))
    {
        lstFields.Add(field);
        field = "";
    }
// This will hold values for each column for current row under processing
    fields = lstFields.ToArray(); 
}

2

La libreria Angara.Table open source consente di caricare CSV in colonne tipizzate, in modo da poter ottenere gli array dalle colonne. Ogni colonna può essere indicizzata sia per nome che per indice. Vedi http://predictionmachines.github.io/Angara.Table/saveload.html .

La libreria segue RFC4180 per CSV; abilita l'inferenza del tipo e le stringhe multilinea.

Esempio:

using System.Collections.Immutable;
using Angara.Data;
using Angara.Data.DelimitedFile;

...

ReadSettings settings = new ReadSettings(Delimiter.Semicolon, false, true, null, null);
Table table = Table.Load("data.csv", settings);
ImmutableArray<double> a = table["double-column-name"].Rows.AsReal;

for(int i = 0; i < a.Length; i++)
{
    Console.WriteLine("{0}: {1}", i, a[i]);
}

Puoi vedere un tipo di colonna usando il tipo Colonna, ad es

Column c = table["double-column-name"];
Console.WriteLine("Column {0} is double: {1}", c.Name, c.Rows.IsRealColumn);

Poiché la libreria è focalizzata su F #, potrebbe essere necessario aggiungere un riferimento all'assembly FSharp.Core 4.4; fai clic su "Aggiungi riferimento" sul progetto e seleziona FSharp.Core 4.4 in "Assiemi" -> "Estensioni".


2

Ho trascorso alcune ore a cercare una libreria corretta, ma alla fine ho scritto il mio codice :) Puoi leggere il file (o il database) con qualsiasi strumento tu voglia e quindi applicare la seguente routine a ogni riga:

private static string[] SmartSplit(string line, char separator = ',')
{
    var inQuotes = false;
    var token = "";
    var lines = new List<string>();
    for (var i = 0; i < line.Length; i++) {
        var ch = line[i];
        if (inQuotes) // process string in quotes, 
        {
            if (ch == '"') {
                if (i<line.Length-1 && line[i + 1] == '"') {
                    i++;
                    token += '"';
                }
                else inQuotes = false;
            } else token += ch;
        } else {
            if (ch == '"') inQuotes = true;
            else if (ch == separator) {
                lines.Add(token);
                token = "";
                } else token += ch;
            }
    }
    lines.Add(token);
    return lines.ToArray();
}

1

Uso csvreader.com (componente a pagamento) da anni e non ho mai avuto problemi. È solido, piccolo e veloce, ma devi pagare per questo. Puoi impostare il delimitatore come preferisci.

using (CsvReader reader = new CsvReader(s) {
    reader.Settings.Delimiter = ';';
    reader.ReadHeaders();  // if headers on a line by themselves.  Makes reader.Headers[] available
    while (reader.ReadRecord())
        ... use reader.Values[col_i] ...
}

1

Sono solo uno studente che lavora alla tesi del mio master, ma è così che l'ho risolto e ha funzionato bene per me. Prima seleziona il tuo file dalla directory (solo in formato CSV) e poi inserisci i dati negli elenchi.

List<float> t = new List<float>();
List<float> SensorI = new List<float>();
List<float> SensorII = new List<float>();
List<float> SensorIII = new List<float>();
using (OpenFileDialog dialog = new OpenFileDialog())
{
    try
    {
        dialog.Filter = "csv files (*.csv)|*.csv";
        dialog.Multiselect = false;
        dialog.InitialDirectory = ".";
        dialog.Title = "Select file (only in csv format)";
        if (dialog.ShowDialog() == DialogResult.OK)
        {
            var fs = File.ReadAllLines(dialog.FileName).Select(a => a.Split(';'));
            int counter = 0;
            foreach (var line in fs)
            {
                counter++;
                if (counter > 2)    // Skip first two headder lines
                {
                    this.t.Add(float.Parse(line[0]));
                    this.SensorI.Add(float.Parse(line[1]));
                    this.SensorII.Add(float.Parse(line[2]));
                    this.SensorIII.Add(float.Parse(line[3]));
                }
            }
        }
    }
    catch (Exception exc)
    {
        MessageBox.Show(
            "Error while opening the file.\n" + exc.Message, 
            this.Text, 
            MessageBoxButtons.OK, 
            MessageBoxIcon.Error
        );
    }
}

0

Ancora sbagliato. È necessario compensare "" tra virgolette. Ecco la mia soluzione Microsoft Style CSV.

               /// <summary>
    /// Microsoft style csv file.  " is the quote character, "" is an escaped quote.
    /// </summary>
    /// <param name="fileName"></param>
    /// <param name="sepChar"></param>
    /// <param name="quoteChar"></param>
    /// <param name="escChar"></param>
    /// <returns></returns>
    public static List<string[]> ReadCSVFileMSStyle(string fileName, char sepChar = ',', char quoteChar = '"')
    {
        List<string[]> ret = new List<string[]>();

        string[] csvRows = System.IO.File.ReadAllLines(fileName);

        foreach (string csvRow in csvRows)
        {
            bool inQuotes = false;
            List<string> fields = new List<string>();
            string field = "";
            for (int i = 0; i < csvRow.Length; i++)
            {
                if (inQuotes)
                {
                    // Is it a "" inside quoted area? (escaped litteral quote)
                    if(i < csvRow.Length - 1 && csvRow[i] == quoteChar && csvRow[i+1] == quoteChar)
                    {
                        i++;
                        field += quoteChar;
                    }
                    else if(csvRow[i] == quoteChar)
                    {
                        inQuotes = false;
                    }
                    else
                    {
                        field += csvRow[i];
                    }
                }
                else // Not in quoted region
                {
                     if (csvRow[i] == quoteChar)
                    {
                        inQuotes = true;
                    }
                    if (csvRow[i] == sepChar)
                    {
                        fields.Add(field);
                        field = "";
                    }
                    else 
                    {
                        field += csvRow[i];
                    }
                }
            }
            if (!string.IsNullOrEmpty(field))
            {
                fields.Add(field);
                field = "";
            }
            ret.Add(fields.ToArray());
        }

        return ret;
    }
}

3
Non gestisce il caso in cui ci sono nuove righe all'interno dei valori della colonna;)
Emil,

0

Ho una biblioteca che sta facendo esattamente ciò di cui hai bisogno.

Qualche tempo fa avevo scritto una libreria abbastanza semplice e veloce per lavorare con i file CSV. Puoi trovarlo al seguente link: https://github.com/ukushu/DataExporter

Funziona con CSV come con un array di 2 dimensioni. Proprio come ti serve.

Ad esempio, nel caso tu abbia bisogno di tutti i valori della terza riga, devi solo scrivere:

Csv csv = new Csv();

csv.FileOpen("c:\\file1.csv");

var allValuesOf3rdRow = csv.Rows[2];

o leggere la seconda cella di

var value = csv.Rows[2][1];

-1

guarda questo

usando CsvFramework;

utilizzando System.Collections.Generic;

spazio dei nomi CvsParser {

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Order> Orders { get; set; }        
}

public class Order
{
    public int Id { get; set; }

    public int CustomerId { get; set; }
    public int Quantity { get; set; }

    public int Amount { get; set; }

    public List<OrderItem> OrderItems { get; set; }

}

public class Address
{
    public int Id { get; set; }
    public int CustomerId { get; set; }

    public string Name { get; set; }
}

public class OrderItem
{
    public int Id { get; set; }
    public int OrderId { get; set; }

    public string ProductName { get; set; }
}

class Program
{
    static void Main(string[] args)
    {

        var customerLines = System.IO.File.ReadAllLines(@"Customers.csv");
        var orderLines = System.IO.File.ReadAllLines(@"Orders.csv");
        var orderItemLines = System.IO.File.ReadAllLines(@"OrderItemLines.csv");

        CsvFactory.Register<Customer>(builder =>
        {
            builder.Add(a => a.Id).Type(typeof(int)).Index(0).IsKey(true);
            builder.Add(a => a.Name).Type(typeof(string)).Index(1);
            builder.AddNavigation(n => n.Orders).RelationKey<Order, int>(k => k.CustomerId);

        }, false, ',', customerLines);

        CsvFactory.Register<Order>(builder =>
        {
            builder.Add(a => a.Id).Type(typeof(int)).Index(0).IsKey(true);
            builder.Add(a => a.CustomerId).Type(typeof(int)).Index(1);
            builder.Add(a => a.Quantity).Type(typeof(int)).Index(2);
            builder.Add(a => a.Amount).Type(typeof(int)).Index(3);
            builder.AddNavigation(n => n.OrderItems).RelationKey<OrderItem, int>(k => k.OrderId);

        }, true, ',', orderLines);


        CsvFactory.Register<OrderItem>(builder =>
        {
            builder.Add(a => a.Id).Type(typeof(int)).Index(0).IsKey(true);
            builder.Add(a => a.OrderId).Type(typeof(int)).Index(1);
            builder.Add(a => a.ProductName).Type(typeof(string)).Index(2);


        }, false, ',', orderItemLines);



        var customers = CsvFactory.Parse<Customer>();


    }
}

}

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.