Читання файлу CSV та збереження значень у масиві


317

Я намагаюся прочитати *.csv-файл.

Файл *.csvскладається з двох стовпців, розділених крапкою з комою (" ; ").

Я вмію читати *.csv-файл за допомогою StreamReader і вмію відокремлювати кожен рядок за допомогою Split()функції. Я хочу зберігати кожен стовпець в окремому масиві, а потім відображати його.

Чи можна це зробити?


2
@Marc: на жаль, у не англійських культурах (наприклад, італійська), коли ви зберігаєте чудовий вміст у CSV, він використовується ";"як роздільник ... це зробило CSV нестандартним imo :(
digEmAll

25
Я завжди читаю CSV як розділені символами значення, оскільки люди називають файли CSV, навіть якщо вони не використовують кому як роздільник. І на практиці існує стільки діалектів з різними правилами цитування чи відмови, що ти не можеш реально говорити про стандарт, навіть якщо теоретично існує RFC.
CodesInChaos

1
Ім’я розширення файлу CSV тепер має змінити DSV - файл розділених значень розділених
знаків

Для всіх відповідей, які просто розділяють рядок на символі роздільника, це не найкращий шлях. Існує більше правил щодо формату CSV, які це не стосуватиметься. Найкраще використовувати третій аналізатор. Більше info- dotnetcoretutorials.com/2018/08/04/csv-parsing-in-net-core
iliketocode

Відповіді:


415

Ви можете це зробити так:

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
Дякую за це, я забув, як розділити рядки у файлі csv (німий мене!), Але ваше рішення допомогло мені :)
Hallaghan

4
Це вже через 3 роки, і це питання все ще комусь допомагає. Мені погано, що ви не отримали з цього приводу.
AdamMc331

12
Не обробляє значення полів комами тощо.
Майк,

12
Якщо використовувати usingпункт тут, або принаймні , вручну так що це ресурс. Close()readerIDisposible
Ассаф Ізраїль

30
Це також не буде належним чином аналізувати CSV, написане на зразок column1;"Special ; char in string";column3- tools.ietf.org/html/rfc4180
Ole K

173

Мій улюблений аналізатор CSV - це вбудований у .NET бібліотеку. Це прихований скарб всередині простору імен Microsoft.VisualBasic. Нижче наведено зразок коду:

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

Не забудьте додати посилання на Microsoft.VisualBasic

Більш детальну інформацію про аналізатор подано тут: http://codeskaters.blogspot.ae/2015/11/c-easiest-csv-parser-built-in-net.html


6
Мені найбільше подобається цей варіант. Мені не потрібно турбуватися про символи втечі, оскільки клас - це аналізатор CSV, а не те, що будується вручну.
Тимофій Гонсалес

22
У випадку, якщо хтось стикається з цим і цікавиться, вам потрібно буде включити посилання на Microsoft.VisualBasicзбірку фреймворків, оскільки, як правило, це не посилається за замовчуванням.
апокрифос

3
Я б хотів, щоб я пам’ятав це з моїх днів VB6, врятував би мені багато часу за ці роки. Хоча деякі будуть гріхати про VB, я не маю жодних проблем з додаванням dll & namespace до свого коду, якщо він має значення. Це має багато значення.
Вальтер

2
Це рішення - гомерун. дуже надійний аналізатор з мого досвіду.
Гленн Феррі

3
Чому тільки у VB dll?
Марк Чой

75

Шлях LINQ:

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

^^ Неправильно - Редагував Нік

Здається, оригінальний відповідач намагався заповнити csvдвовимірний масив - масив, що містить масиви. Кожен елемент першого масиву містить масив, що представляє номер рядка з кожним елементом вкладеного масиву, що містить дані для цього конкретного стовпця.

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

2
Можливо, мені чогось не вистачає, але я не впевнений, у чому полягає зміна вашої змінної csv - чи не просто ви заново створили ту саму структуру даних, яка перечислена в рядках?
Бен Х'юз

13
@ClayShannon .NET 1.1? Мені ... дуже шкода вас.
contactmatt

5
@contactmatt: Я не відкидаю тебе від цих настроїв.
Б. Клей Шеннон

9
Я також хочу зазначити, що можна csv's цитувати ... Тому використання string.Split не є життєздатним варіантом.
Олександр

5
Я отримую: 'System.Array' не містить визначення для 'Split' і не може бути знайдено метод розширення 'Split', який приймає перший аргумент типу 'System.Array' (якщо ви не використовуєте директиву чи посилання на збірку ?)
Kala J

36

Ви не можете створити масив одразу, оскільки вам потрібно знати кількість рядків з самого початку (і для цього знадобиться прочитати файл csv двічі)

Ви можете зберігати значення у два, List<T>а потім використовувати їх або перетворювати в масив, використовуючиList<T>.ToArray()

Дуже простий приклад:

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

Зверніть увагу, що це лише дуже простий приклад . Використання string.Splitне враховує випадки, коли деякі записи містять роздільник ;всередині нього.
Для більш безпечного підходу розгляньте можливість використання деяких бібліотек csv, таких як CsvHelper у nuget.


Не враховує, ;що є частиною значення, наприклад "value with ; inside it". Об'ємні значення CSV, що містять спеціальні символи, мають подвійні лапки, щоб сказати, що це буквальний рядок.
ChickenFeet

1
@ChickenFeet: впевнений, це причина підпису: "Дуже простий приклад" . У будь-якому разі я можу додати примітку про це;)
digEmAll

Не хвилюйтесь, я помітив, що багато інших відповідей тут також не враховують це :)
ChickenFeet

1
Regex.Split (sr.ReadLine (), ", (? = (?: [^ \"] * \ "[^ \"] * \ ") * [^ \"] * $) "); // Знайдено це на SO ... швидше, ніж у бібліотеці
Пінч

34

Щойно натрапив на цю бібліотеку: https://github.com/JoshClose/CsvHelper

Дуже інтуїтивно зрозумілий і простий у використанні. Має також цілий пакет, який швидко реалізується: http://nuget.org/packages/CsvHelper/1.17.0 . Також, схоже, активно підтримується, що мені подобається.

Налаштувати його для використання напівкрапки дуже просто: https://github.com/JoshClose/CsvHelper/wiki/Custom-Configurations


3
Це найкраща відповідь! Надійна бібліотека, яку легко запустити та закатати.
Тайлер Форсайт

3
Бібліотека CsvHelper - фантастична. Супер швидкий і простий у використанні.
Стів Парафій

3
Якщо ви шукаєте бібліотеку, яка може працювати з усіма аспектами формату csv, включаючи рядки, що цитуються, використовуйте цей. Дивовижно!
Мет

Thx, дійсно приємна бібліотека, проста у використанні та дуже міцна.
Себастьян Герреро

2
Як порівняння продуктивності відповідає Microsoft.VisualBasic.FileIO.TextFieldParser(див. Відповідь @ Хабіба)?
bovender

33

Зазвичай я використовую цей аналізатор з codeproject , оскільки є купа втеч символів і подібних, які він обробляє для мене.


2
ця річ дуже гарна і швидка. Якщо ви перебуваєте в бізнес-ситуації, і вам потрібно отримати злом, скористайтеся цим.
gjvdkamp

8
Цей парсер доступний у галереї Nuget як LumenWorks.Framework.IO, якщо ви не хочете зареєструватися для CodeProject, щоб завантажити його.
Грег Маккой

30

Ось моя версія голосової відповіді:

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

Потім csvзмінну можна використовувати як у наступному прикладі:

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

Як ви отримуєте доступ до рядків і стовпців у змінній csv?
Меттью Лок

1
як ти поводишся з комою втечі?
Kuangwei Zhang

Не обробляє коми в стовпцях. Краще використовувати надійну бібліотеку CsvHelper відповідно до відповіді
Тім Партрідж

11

Якщо вам потрібно пропустити (заголовки) рядки та / або стовпці, ви можете використовувати це для створення двовимірного масиву:

    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

Це дуже корисно, якщо вам потрібно сформувати дані, перш ніж опрацювати їх (якщо припустити, що перші 2 рядки складаються з заголовка, а перший стовпець - це заголовок рядка - якого вам не потрібно мати в масиві, оскільки ви просто хочу врахувати дані).

Примітка. Ви можете легко отримати заголовки та перший стовпець, скориставшись таким кодом:

    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

Цей приклад коду передбачає таку структуру вашого *.csvфайлу:

Матриця CSV

Примітка. Якщо вам потрібно пропустити порожні рядки - що зручно іноді, ви можете зробити це, вставивши

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

між fromі selectоператором у наведених вище прикладах коду LINQ .


10

Ви можете використовувати Microsoft.VisualBasic.FileIO.TextFieldParser dll в C # для кращої продуктивності

отримати нижче приклад коду з наведеної статті

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
Це не так ефективно, оскільки Split не робить все, що робить TextFieldParser. Наприклад, пропустіть рядки коментарів, обробіть цитовані поля та видаліть пробіл початку / останнього. Не зовсім порівняння 1: 1.
Роберт Маккі

5

Привіт усім, я створив статичний клас для цього. + перевірка стовпця + видалення знака квоти

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

Спасибі за вашу допомогу. Це може допомогти вирішити мою проблему. Насправді мені доводиться читати дані з файлу, а потім вставляти в базу даних. Під час вставки я отримую помилку обмеження первинного ключа (оскільки у мене вже є дані в базі даних). Отже, мені потрібно запрограмувати таку, що зі змінною вже існує, а потім оновити дані.
Рушабх Шах

Я припускаю перше значення, якщо PK - вам потрібно отримати запис за ідентифікатором з бази даних, а якщо він існує, ніж видавати оператор UPDATE, інакше вставити новий запис.
Якуб Конецький

3

Ось особливий випадок, коли одне поле даних має крапку з комою (";") як частину його даних, і в цьому випадку більшість відповідей вище не буде.

Вирішіть так, що буде

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

Бібліотека Angara.Table з відкритим кодом дозволяє завантажувати CSV у набрані стовпці, тому ви можете отримати масиви зі стовпців. Кожен стовпець може бути індексований як назвою, так і покажчиком. Див. Http://predictionmachines.github.io/Angara.Table/saveload.html .

Бібліотека дотримується RFC4180 для CSV; це дозволяє вводити умови висновку та багаторядкові рядки.

Приклад:

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

Ви можете бачити тип стовпця, використовуючи тип стовпця, наприклад

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

Оскільки бібліотека орієнтована на F #, вам може знадобитися додати посилання на збірку FSharp.Core 4.4; натисніть "Додати довідку" проекту та виберіть FSharp.Core 4.4 у розділі "Збори" -> "Розширення".


2

Я витратив кілька годин на пошуки потрібної бібліотеки, але нарешті я написав власний код :) Ви можете прочитати файл (або базу даних) будь-якими інструментами, які ви хочете, а потім застосувати наступний розпорядок до кожного рядка:

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

Я використовую csvreader.com (платний компонент) роками, і у мене ніколи не було проблем. Це солідно, мало і швидко, але за це доведеться платити. Ви можете встановити роздільник на все, що завгодно.

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

Я просто студент, що працює над магістерською дисертацією, але саме так я її вирішив, і це добре працювало на мене. Спочатку вибираєте свій файл із каталогу (лише у форматі csv), а потім вносите дані у списки.

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

Досі помиляюся. Вам потрібно компенсувати "" в лапках. Ось моє рішення у стилі Microsoft 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
Він не справляється із випадком, коли у значеннях стовпців є нові рядки;)
Еміль

0

У мене є бібліотека, яка робить саме те, що потрібно.

Деякий час тому я написав просту і досить швидку бібліотеку для роботи з файлами CSV. Ви можете знайти його за наступним посиланням: https://github.com/ukushu/DataExporter

Він працює з CSV, як з масивом 2 вимірів. Точно так, як вам потрібно.

Наприклад, якщо вам знадобляться всі значення 3-го рядка, потрібно лише написати:

Csv csv = new Csv();

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

var allValuesOf3rdRow = csv.Rows[2];

або прочитати другу клітинку

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

-1

подивись на це

використання CsvFramework;

використовуючи System.Collections.Generic;

простір імен 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>();


    }
}

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.