Membaca file CSV dan menyimpan nilai ke dalam array

317

Saya mencoba membaca *.csv-file.

File *.csv-file terdiri dari dua kolom yang dipisahkan oleh titik koma (" ; ").

Saya dapat membaca *.csv-file menggunakan StreamReader dan dapat memisahkan setiap baris dengan menggunakan Split()fungsi. Saya ingin menyimpan setiap kolom ke dalam array yang terpisah dan kemudian menampilkannya.

Apakah mungkin untuk melakukan itu?

Rushabh Shah
sumber
2
@ Markc: sayangnya dalam budaya non-Inggris (misalnya Italia) ketika Anda menyimpan excel ke CSV yang digunakannya ";"sebagai pemisah ... ini menjadikan CSV sebagai imo non-standar :(
digEmAll
25
Saya selalu membaca CSV sebagai nilai yang dipisahkan karakter karena orang memanggil file CSV walaupun mereka tidak menggunakan koma sebagai pemisah. Dan ada begitu banyak dialek dengan aturan kutip atau melarikan diri yang berbeda dalam praktiknya sehingga Anda tidak dapat benar-benar berbicara tentang standar bahkan jika secara teori ada RFC.
CodesInChaos
1
Nama ekstensi file CSV sekarang harus berubah menjadi DSV - Pembatas File Nilai Terpisah
Ambuj
Untuk semua jawaban yang hanya membagi string pada karakter pembatas, ini bukan cara terbaik untuk melakukannya. Ada lebih banyak aturan dalam format CSV yang tidak akan dibahas. Cara terbaik adalah menggunakan pengurai pihak ke-3. Info lebih lanjut- dotnetcoretutorials.com/2018/08/04/csv-parsing-in-net-core
iliketocode

Jawaban:

415

Anda dapat melakukannya seperti ini:

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]);
        }
    }
}
Michael M.
sumber
5
Terima kasih untuk ini, saya lupa bagaimana membagi baris dalam file csv (bodoh!) Tetapi solusi Anda membantu saya :)
Hallaghan
4
Sudah lebih dari 3 tahun kemudian dan pertanyaan ini masih membantu seseorang. Saya merasa sedih karena Anda tidak menerima ini.
AdamMc331
12
Tidak menangani nilai bidang dengan koma, dll.
Mike
12
Harus menggunakan usingklausa sini, atau setidaknya secara manual Close()yang readerseperti itu merupakan IDisposiblesumber daya.
Assaf Israel
30
Ini juga tidak akan melewatkan CSV yang ditulis dengan benar seperti column1;"Special ; char in string";column3- tools.ietf.org/html/rfc4180
Ole K
173

Parser CSV favorit saya adalah satu yang dibangun di perpustakaan .NET. Ini adalah harta terpendam di dalam namespace Microsoft.VisualBasic. Di bawah ini adalah contoh kode:

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

Ingatlah untuk menambahkan referensi Microsoft.VisualBasic

Rincian lebih lanjut tentang parser diberikan di sini: http://codeskaters.blogspot.ae/2015/11/c-easiest-csv-parser-built-in-net.html

Habeeb
sumber
6
Saya suka opsi ini yang terbaik. Saya tidak perlu khawatir tentang karakter melarikan diri karena kelas adalah parser CSV dan bukan sesuatu yang sedang dibangun secara manual.
Timothy Gonzalez
22
Jika ada yang mengalami hal ini dan bertanya-tanya, Anda harus memasukkan referensi ke Microsoft.VisualBasicrakitan kerangka karena biasanya tidak dirujuk secara default.
apokryfos
3
Saya berharap saya ingat ini dari hari VB6 saya, akan menyelamatkan saya banyak waktu selama bertahun-tahun. Sementara beberapa akan berteriak-teriak tentang VB, saya tidak memiliki masalah menambahkan dll & namespace ke kode saya jika memiliki nilai. Ini memiliki BANYAK nilai.
Walter
2
Solusi ini adalah homerun. parser yang sangat andal dari pengalaman saya.
Glenn Ferrie
3
Kenapa hanya di VB dll?
Mark Choi
75

Cara LINQ:

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

^^ Salah - Edit oleh Nick

Tampaknya penjawab asli berusaha mengisi csvdengan array 2 dimensi - array yang berisi array. Setiap item dalam array pertama berisi array yang mewakili nomor baris dengan setiap item dalam array bersarang yang berisi data untuk kolom tertentu.

var csv = from line in lines
          select (line.Split(',')).ToArray();
as-cii
sumber
2
Mungkin saya melewatkan sesuatu, tapi saya tidak yakin apa gunanya variabel csv Anda - bukankah Anda hanya membuat ulang struktur data yang sama yang sudah di-barisan?
Ben Hughes
13
@ClayShannon .NET 1.1? Saya ... sangat menyesal untuk Anda.
contactmatt
5
@contactmatt: Saya tidak akan melemahkan sentimen Anda.
B. Clay Shannon
9
Saya juga ingin menunjukkan bahwa csv dapat dikutip ... Jadi, menggunakan string.Split bukan pilihan yang layak.
Alxandr
5
Saya mendapatkan: 'System.Array' tidak mengandung definisi untuk 'Split' dan tidak ada metode ekstensi 'Split' yang menerima argumen pertama dari tipe 'System.Array' dapat ditemukan (apakah Anda kehilangan arahan menggunakan atau referensi rakitan ?)
Kala J
36

Anda tidak dapat langsung membuat array karena Anda perlu mengetahui jumlah baris dari awal (dan ini perlu membaca file csv dua kali)

Anda bisa menyimpan nilai dalam dua List<T>dan kemudian menggunakannya atau mengubahnya menjadi menggunakan arrayList<T>.ToArray()

Contoh yang sangat sederhana:

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

Harap perhatikan bahwa ini hanyalah contoh yang sangat sederhana . Menggunakan string.Splittidak memperhitungkan kasus di mana beberapa catatan berisi pemisah ;di dalamnya.
Untuk pendekatan yang lebih aman, pertimbangkan untuk menggunakan beberapa pustaka spesifik csv seperti CsvHelper di nuget.

menggali semua
sumber
Tidak memperhitungkan ;menjadi bagian dari nilai, misalnya "value with ; inside it". Nilai surround CSV berisi karakter khusus dengan tanda kutip ganda untuk mengatakan bahwa itu adalah string literal.
ChickenFeet
1
@ChickenFeet: tentu, itulah alasan keterangan: "Contoh yang sangat sederhana" . Pokoknya saya bisa menambahkan catatan tentang itu;)
digEmAll
Jangan khawatir, saya perhatikan banyak jawaban lain di sini juga tidak memperhitungkannya :)
ChickenFeet
1
Regex.Split (sr.ReadLine (), ", (? = (?: [^ \"] * \ "[^ \"] * \ ") * [^ \"] * $) "); // Ditemukan ini pada SO ... lebih cepat dari perpustakaan
Pinch
34

Baru saja menemukan perpustakaan ini: https://github.com/JoshClose/CsvHelper

Sangat intuitif dan mudah digunakan. Memiliki paket nuget juga yang dibuat cepat untuk diimplementasikan: http://nuget.org/packages/CsvHelper/1.17.0 . Tampaknya juga dipelihara secara aktif yang saya suka.

Mengonfigurasinya untuk menggunakan titik koma adalah mudah: https://github.com/JoshClose/CsvHelper/wiki/Custom-Configurations

Astaga
sumber
3
Ini jawaban terbaik! Pustaka yang tangguh dan mudah untuk digunakan.
Tyler Forsythe
3
Perpustakaan CsvHelper fantastis. Sangat cepat dan mudah digunakan.
Steve Parish
3
Jika Anda mencari perpustakaan yang dapat menangani setiap aspek format csv termasuk string yang dikutip, gunakan yang ini. Luar biasa!
Matt
Terima kasih, perpustakaan yang sangat bagus, mudah digunakan dan sangat kuat.
Sebastián Guerrero
2
Bagaimana kinerja dibandingkan dengan Microsoft.VisualBasic.FileIO.TextFieldParser(lih. @ Habeeb's jawaban)?
bovender
33

Saya biasanya menggunakan parser ini dari proyek codep , karena ada banyak karakter yang lolos dan sejenisnya yang menangani untuk saya.

Paul
sumber
2
benda ini sangat bagus dan cepat. Jika Anda berada dalam situasi bisnis dan perlu menggunakan ini.
gjvdkamp
8
Parser ini tersedia di galeri Nuget sebagai LumenWorks.Framework.IO, jika Anda tidak ingin mendaftar untuk CodeProject untuk mengunduhnya.
Greg McCoy 3-15
30

Berikut adalah variasi saya dari jawaban terpilih teratas:

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

The csvvariabel kemudian dapat digunakan seperti dalam contoh berikut:

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];
}
tomsv
sumber
Bagaimana Anda mengakses baris dan kolom dalam variabel csv?
Matthew Lock
1
bagaimana Anda menangani koma melarikan diri?
Kuangwei Zhang
Tidak menangani koma dalam kolom. Lebih baik menggunakan CsvHelper perpustakaan yang kuat sesuai jawaban
Tim Partridge
11

Jika Anda perlu melewati (head-) garis dan / atau kolom, Anda dapat menggunakan ini untuk membuat array 2 dimensi:

    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

Ini cukup berguna jika Anda perlu membentuk data sebelum Anda memprosesnya lebih lanjut (dengan asumsi 2 baris pertama terdiri dari informasi utama, dan kolom pertama adalah judul baris - yang tidak perlu Anda miliki dalam array karena Anda hanya perlu ingin memperhatikan data).

NB Anda dapat dengan mudah mendapatkan tajuk utama dan kolom ke-1 dengan menggunakan kode berikut:

    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

Contoh kode ini mengasumsikan struktur *.csvfile Anda sebagai berikut :

Matriks CSV

Catatan: Jika Anda perlu melewati baris kosong - yang terkadang bisa berguna, Anda bisa melakukannya dengan memasukkan

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

antara fromdan selectpernyataan dalam contoh kode LINQ di atas.

Mat
sumber
10

Anda dapat menggunakan Microsoft.VisualBasic.FileIO.TextFieldParser dll di C # untuk kinerja yang lebih baik

dapatkan contoh kode di bawah ini dari artikel di atas

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;
}
kombsh
sumber
9
Ini tidak seefisien Split tidak melakukan semua yang TextFieldParser lakukan. Misalnya, lewati baris komentar, pegang bidang yang dikutip, dan hapus spasi awal / trailing spasi. Bukan perbandingan 1: 1.
Robert McKee
5

Hai semua, saya membuat kelas statis untuk melakukan ini. + cek kolom + penghapusan tanda kuota

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

}
Mathias Schmidt
sumber
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();
Jakub Konecki
sumber
Terima kasih atas bantuan Anda. Mungkin membantu menyelesaikan masalah saya. Sebenarnya saya harus membaca data dari file dan kemudian memasukkan ke dalam database. Pada saat memasukkan saya mendapatkan kesalahan batasan kunci primer (karena saya sudah memiliki data dalam database). Jadi, saya perlu memprogram sedemikian rupa sehingga dengan variabel sudah ada kemudian memperbarui data.
Rushabh Shah
Saya menganggap nilai pertama jika PK - Anda perlu mendapatkan catatan oleh id dari database dan jika ada daripada mengeluarkan pernyataan UPDATE, jika tidak masukkan catatan baru.
Jakub Konecki
3

Berikut adalah kasus khusus di mana salah satu bidang data memiliki titik koma (";") sebagai bagian dari data itu dalam kasus itu sebagian besar jawaban di atas akan gagal.

Solusi itu yang akan terjadi

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

Pustaka Angara.Table open-source memungkinkan untuk memuat CSV ke dalam kolom yang diketik, sehingga Anda bisa mendapatkan array dari kolom. Setiap kolom dapat diindeks berdasarkan nama atau indeks. Lihat http://predictionmachines.github.io/Angara.Table/saveload.html .

Perpustakaan mengikuti RFC4180 untuk CSV; memungkinkan inferensi tipe dan string multiline.

Contoh:

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

Anda dapat melihat tipe kolom menggunakan tipe Kolom, mis

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

Karena perpustakaan difokuskan pada F #, Anda mungkin perlu menambahkan referensi ke perakitan FSharp.Core 4.4; klik 'Tambahkan Referensi' pada proyek dan pilih FSharp.Core 4.4 di bawah "Assemblies" -> "Extensions".

Dmitry Voytsekhovskiy
sumber
2

Saya telah menghabiskan beberapa jam mencari perpustakaan yang tepat, tetapi akhirnya saya menulis kode saya sendiri :) Anda dapat membaca file (atau database) dengan alat apa pun yang Anda inginkan dan kemudian menerapkan rutinitas berikut untuk setiap baris:

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();
}
Zbyszek Swirski
sumber
1

Saya telah menggunakan csvreader.com (komponen berbayar) selama bertahun-tahun, dan saya tidak pernah punya masalah. Ini solid, kecil dan cepat, tetapi Anda harus membayarnya. Anda dapat mengatur pembatas ke apa pun yang Anda suka.

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] ...
}
Oliver Bock
sumber
1

Saya hanya seorang siswa yang sedang mengerjakan tesis master saya, tetapi ini adalah cara saya menyelesaikannya dan itu bekerja dengan baik untuk saya. Pertama Anda memilih file Anda dari direktori (hanya dalam format csv) dan kemudian Anda memasukkan data ke dalam daftar.

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
        );
    }
}
Daniel
sumber
0

Masih salah. Anda perlu mengganti "" dalam tanda kutip. Ini solusi saya 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;
    }
}
R Keene
sumber
3
Itu tidak menangani kasus ketika ada baris baru di dalam nilai kolom;)
Emil
0

Saya memiliki perpustakaan yang melakukan persis yang Anda butuhkan.

Beberapa waktu lalu saya telah menulis perpustakaan yang sederhana dan cukup cepat untuk bekerja dengan file CSV. Anda dapat menemukannya dengan tautan berikut: https://github.com/ukushu/DataExporter

Ini bekerja dengan CSV seperti dengan array 2 dimensi. Persis seperti yang Anda butuhkan.

Sebagai contoh, jika Anda membutuhkan semua nilai baris ke-3, Anda hanya perlu menulis:

Csv csv = new Csv();

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

var allValuesOf3rdRow = csv.Rows[2];

atau membaca sel ke-2 dari

var value = csv.Rows[2][1];
Andrew
sumber
-1

Lihat ini

menggunakan CsvFramework;

menggunakan System.Collections.Generic;

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


    }
}

}

tobias
sumber