Odczytywanie pliku CSV i przechowywanie wartości w tablicy


317

Próbuję odczytać *.csvplik.

*.csv-File składa się z dwóch kolumn oddzielone średnikiem ( „ ”).

Jestem w stanie odczytać *.csvplik za pomocą StreamReadera i mogę oddzielić każdą linię za pomocą Split()funkcji. Chcę zapisać każdą kolumnę w osobnej tablicy, a następnie wyświetlić ją.

czy jest to możliwe do zrobienia?


2
@Marc: niestety w kulturach nieanglojęzycznych (np. Włoskich), kiedy zapisujesz excel w CSV, używa go ";"jako separatora ... dzięki temu CSV jest niestandardowym imo :(
digEmAll

25
Zawsze czytam CSV jako wartości rozdzielone znakami, ponieważ ludzie nazywają pliki CSV, nawet jeśli nie używają przecinka jako separatora. I jest tak wiele dialektów z różnymi regułami cytowania lub ucieczki w praktyce, że tak naprawdę nie można mówić o standardzie, nawet jeśli teoretycznie istnieje RFC.
CodesInChaos

1
Nazwa rozszerzenia pliku CSV powinna teraz zmienić się na DSV - plik wartości oddzielnych
separatora

W przypadku wszystkich odpowiedzi, które po prostu dzielą ciąg na znak ogranicznika, nie jest to najlepsza droga. Format CSV zawiera więcej zasad, których nie obejmie. Najlepiej jest użyć zewnętrznego parsera. Więcej informacji
iliketocode

Odpowiedzi:


415

Możesz to zrobić w następujący sposób:

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
Dzięki za to, zapomniałem, jak podzielić linie w pliku csv (głupie mnie!), Ale twoje rozwiązanie pomogło mi :)
Hallaghan

4
To już ponad 3 lata później i to pytanie wciąż komuś pomaga. Czuję się źle, że nie zaakceptowałeś tego.
AdamMc331,

12
Nie obsługuje wartości pól przecinkami itp.
Mike

12
Należy użyć usingklauzuli tutaj, albo przynajmniej ręcznie jak to jest zasobem. Close()readerIDisposible
Assaf Israel

30
To również nie będzie poprawnie parsować pliku CSV napisanego jak column1;"Special ; char in string";column3- tools.ietf.org/html/rfc4180
Ole K

173

Mój ulubiony parser CSV to wbudowany w bibliotekę .NET. To ukryty skarb w przestrzeni nazw Microsoft.VisualBasic. Poniżej znajduje się przykładowy kod:

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];
 }
}

Pamiętaj, aby dodać odniesienie do Microsoft.VisualBasic

Więcej szczegółów na temat parsera znajduje się tutaj: http://codeskaters.blogspot.ae/2015/11/c-easiest-csv-parser-built-in-net.html


6
Najbardziej podoba mi się ta opcja. Nie muszę się martwić o znaki specjalne, ponieważ klasa jest parserem CSV, a nie czymś budowanym ręcznie.
Timothy Gonzalez,

22
W przypadku, gdy ktoś na to wpadnie i zastanawia się, musisz dołączyć odwołanie do Microsoft.VisualBasiczestawu frameworka, ponieważ zwykle nie jest to odniesienie domyślnie.
apokryfos

3
Chciałbym zapamiętać to z moich dni VB6, aby zaoszczędzić mi dużo czasu na przestrzeni lat. Chociaż niektórzy będą narzekać na VB, nie mam problemu z dodaniem biblioteki dll i przestrzeni nazw do mojego kodu, jeśli ma on wartość. To ma DUŻO wartości.
Walter

2
To rozwiązanie jest homerun. bardzo niezawodny parser z mojego doświadczenia.
Glenn Ferrie

3
Dlaczego tylko w dll VB?
Mark Choi

75

Sposób LINQ:

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

^^ Wrong - Edytuj przez Nick

Wygląda na to, że oryginalny program odpowiadający próbował zapełnić csvtablicę dwuwymiarową - tablicę zawierającą tablice. Każdy element w pierwszej tablicy zawiera tablicę reprezentującą ten numer wiersza, a każdy element w zagnieżdżonej tablicy zawiera dane dla tej konkretnej kolumny.

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

2
Może czegoś mi brakuje, ale nie jestem pewien, jaki jest sens twojej zmiennej csv - czy nie tworzysz tylko tej samej struktury danych, która jest zmieniana w wierszach?
Ben Hughes

13
@ClayShannon .NET 1.1? Przykro mi ... bardzo za ciebie.
contactmatt

5
@contactmatt: Nie dezaktywuję cię z tego sentymentu.
B. Clay Shannon

9
Chcę również zauważyć, że csv można zacytować ... Więc użycie string.Split nie jest realną opcją.
Alxandr,

5
Dostaję: „System.Array” nie zawiera definicji „Split” i nie można znaleźć metody rozszerzenia „Split” przyjmującej pierwszy argument typu „System.Array” (czy brakuje dyrektywy używającej lub odwołania do zestawu ?)
Kala J

36

Nie możesz natychmiast utworzyć tablicy, ponieważ musisz znać liczbę wierszy od samego początku (a to wymagałoby dwukrotnego odczytania pliku csv)

Możesz przechowywać wartości na dwie części, List<T>a następnie użyć ich lub przekonwertować na tablicę za pomocąList<T>.ToArray()

Bardzo prosty przykład:

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

Pamiętaj, że to tylko bardzo prosty przykład . Użycie string.Splitnie uwzględnia przypadków, w których niektóre rekordy zawierają w sobie separator ;.
Aby uzyskać bezpieczniejsze podejście, rozważ użycie bibliotek specyficznych dla csv, takich jak CsvHelper na nugecie.


;Przykład nie uwzględnia faktu, że jest częścią wartości "value with ; inside it". Wartości surround CSV zawierające znaki specjalne z podwójnymi cudzysłowami, które oznaczają, że jest to dosłowny ciąg.
ChickenFeet,

1
@ChickenFeet: jasne, to jest przyczyna podpisu: „Bardzo prosty przykład” . W każdym razie mogę dodać notatkę na ten temat;)
digEmAll

Nie martw się, zauważyłem wiele innych odpowiedzi tutaj również tego nie
tłumaczę

1
Regex.Split (sr.ReadLine (), ", (? = (?: [^ \"] * \ "[^ \"] * \ ") * [^ \"] * $) "); // Znaleziono to na SO ... szybciej niż biblioteka
Pinch

34

Właśnie trafiłem na tę bibliotekę: https://github.com/JoshClose/CsvHelper

Bardzo intuicyjny i łatwy w użyciu. Ma również pakiet nuget, który szybko można zaimplementować: http://nuget.org/packages/CsvHelper/1.17.0 . Wydaje się również być aktywnie utrzymywany, co lubię.

Skonfigurowanie go do używania średnika jest łatwe: https://github.com/JoshClose/CsvHelper/wiki/Custom-Configurations


3
To najlepsza odpowiedź! Solidna biblioteka, z którą łatwo się upuszczać i z której można korzystać.
Tyler Forsythe

3
Biblioteka CsvHelper jest fantastyczna. Super szybki i łatwy w użyciu.
Steve Parish

3
Jeśli szukasz biblioteki, która poradzi sobie z każdym aspektem formatu csv, w tym ciągami cytowanymi, skorzystaj z tego. Niesamowite!
Mat.

Dzięki, naprawdę fajna biblioteka, łatwa w użyciu i bardzo solidna.
Sebastián Guerrero

2
Jak wypada porównanie wydajności Microsoft.VisualBasic.FileIO.TextFieldParser(por. Odpowiedź Habeeba)?
bovender

33

Zwykle używam tego parsera z projektu kodu , ponieważ jest kilka ucieczek postaci i podobnych, które obsługuje dla mnie.


2
ta rzecz jest bardzo dobra i szybka. Jeśli jesteś w sytuacji biznesowej i chcesz uzyskać crack, skorzystaj z tego.
gjvdkamp

8
Ten analizator składni jest dostępny w galerii Nuget jako LumenWorks.Framework.IO, na wypadek, gdybyś nie chciał zarejestrować się w CodeProject, aby go pobrać.
Greg McCoy

30

Oto moja odmiana najczęściej głosowanej odpowiedzi:

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

csvZmienne mogą być stosowane tak jak w poniższym przykładzie:

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];
}

Jak uzyskać dostęp do wierszy i kolumn w zmiennej csv?
Matthew Lock

1
jak sobie radzisz z przecinkiem?
Kuangwei Zhang

Nie obsługuje przecinków w kolumnach. Lepiej używać solidnej biblioteki CsvHelper zgodnie z odpowiedzią
Tim Partridge

11

Jeśli musisz pominąć (nagłówkowe) linie i / lub kolumny, możesz użyć tego do utworzenia dwuwymiarowej tablicy:

    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

Jest to bardzo przydatne, jeśli musisz ukształtować dane przed ich dalszym przetwarzaniem (zakładając, że pierwsze 2 linie składają się z nagłówka, a pierwsza kolumna to tytuł wiersza - którego nie musisz mieć w tablicy, ponieważ po prostu chcesz uwzględnić dane).

Uwaga: Możesz łatwo uzyskać nagłówki i pierwszą kolumnę, używając następującego kodu:

    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

W tym przykładzie kodu przyjęto następującą strukturę *.csvpliku:

Matryca CSV

Uwaga: jeśli musisz pominąć puste wiersze - co może czasem być przydatne, możesz to zrobić, wstawiając

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

między instrukcją froma selectw przykładach kodu LINQ powyżej.


10

Możesz użyć dll Microsoft.VisualBasic.FileIO.TextFieldParser w C # dla lepszej wydajności

pobierz poniższy kod z powyższego artykułu

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
Nie jest tak wydajny, ponieważ Split nie robi wszystkiego, co robi TextFieldParser. Na przykład pomiń wiersze komentarza, obsłuż pola cytowane i usuń początkowe / końcowe białe znaki. Niezupełnie porównanie 1: 1.
Robert McKee

5

Cześć wszystkim, stworzyłem klasę statyczną do tego celu. + sprawdzenie kolumny + usunięcie znaku przydziału

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

Dzięki za pomoc. Może to pomóc rozwiązać mój problem. Właściwie muszę odczytać dane z pliku, a następnie wstawić do bazy danych. W momencie wstawiania pojawia się błąd ograniczenia klucza podstawowego (ponieważ mam już dane w bazie danych). Muszę więc zaprogramować, że zmienna już istnieje, a następnie zaktualizować dane.
Rushabh Shah,

Przyjmuję pierwszą wartość, jeśli PK - musisz uzyskać rekord id według bazy danych, a jeśli istnieje, to wydaj instrukcję UPDATE, w przeciwnym razie wstaw nowy rekord.
Jakub Konecki,

3

Oto szczególny przypadek, w którym jedno z pól danych ma średnik („;”) jako część danych, w takim przypadku większość powyższych odpowiedzi nie powiedzie się.

Rozwiązaniem będzie ta sprawa

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

Biblioteka Angara.Table o otwartym kodzie źródłowym pozwala ładować CSV do typowanych kolumn, dzięki czemu można uzyskać tablice z kolumn. Każda kolumna może być indeksowana zarówno według nazwy, jak i indeksu. Zobacz http://predictionmachines.github.io/Angara.Table/saveload.html .

Biblioteka jest zgodna z RFC4180 dla CSV; umożliwia wnioskowanie typu i ciągi wielowierszowe.

Przykład:

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

Możesz zobaczyć typ kolumny, używając typu Kolumna, np

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

Ponieważ biblioteka koncentruje się na F #, może być konieczne dodanie odwołania do zestawu FSharp.Core 4.4; kliknij „Dodaj odniesienie” w projekcie i wybierz FSharp.Core 4.4 w „Asemblies” -> „Extensions”.


2

Spędziłem kilka godzin szukając odpowiedniej biblioteki, ale w końcu napisałem własny kod :) Możesz odczytać plik (lub bazę danych) dowolnymi narzędziami, a następnie zastosować następującą procedurę do każdej linii:

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

Używam csvreader.com (płatny komponent) od lat i nigdy nie miałem problemu. Jest solidny, mały i szybki, ale trzeba za to zapłacić. Możesz ustawić ogranicznik na cokolwiek chcesz.

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

Jestem tylko studentem pracującym nad pracą magisterską, ale w ten sposób ją rozwiązałem i działała dobrze dla mnie. Najpierw wybierz plik z katalogu (tylko w formacie csv), a następnie umieść dane na listach.

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

Wciąż źle. Musisz zrekompensować „” w cudzysłowie. Oto moje rozwiązanie csv w stylu Microsoft.

               /// <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
Nie radzi sobie z przypadkiem, gdy w wartościach kolumn są nowe wiersze;)
Emil

0

Mam bibliotekę, która robi dokładnie to, czego potrzebujesz.

Jakiś czas temu napisałem prostą i wystarczająco szybką bibliotekę do pracy z plikami CSV. Można go znaleźć pod następującym linkiem: https://github.com/ukushu/DataExporter

Działa z CSV jak z tablicą 2 wymiarów. Dokładnie tak, jak potrzebujesz.

Na przykład, jeśli potrzebujesz wszystkich wartości trzeciego rzędu, wystarczy napisać:

Csv csv = new Csv();

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

var allValuesOf3rdRow = csv.Rows[2];

lub przeczytać drugą komórkę

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

-1

Spójrz na to

using CsvFramework;

using System.Collections.Generic;

przestrzeń nazw 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>();


    }
}

}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.