Saya sedang menulis aplikasi impor sederhana dan perlu membaca file CSV, menunjukkan hasil dalam DataGrid
dan menunjukkan baris file CSV yang rusak di grid lain. Misalnya, tunjukkan garis yang lebih pendek dari 5 nilai di kisi lain. Saya mencoba melakukan itu seperti ini:
StreamReader sr = new StreamReader(FilePath);
importingData = new Account();
string line;
string[] row = new string [5];
while ((line = sr.ReadLine()) != null)
{
row = line.Split(',');
importingData.Add(new Transaction
{
Date = DateTime.Parse(row[0]),
Reference = row[1],
Description = row[2],
Amount = decimal.Parse(row[3]),
Category = (Category)Enum.Parse(typeof(Category), row[4])
});
}
tetapi sangat sulit untuk beroperasi pada array dalam hal ini. Apakah ada cara yang lebih baik untuk membagi nilai?
Jawaban:
Jangan menemukan kembali roda. Manfaatkan apa yang sudah ada di .NET BCL.
Microsoft.VisualBasic
(ya, ia mengatakan VisualBasic tetapi bekerja di C # juga - ingat bahwa pada akhirnya itu semua hanya IL)Microsoft.VisualBasic.FileIO.TextFieldParser
kelas untuk mem-parsing file CSVBerikut ini contoh kode:
Ini bekerja sangat baik untuk saya di proyek C # saya.
Berikut ini beberapa tautan / informasi:
sumber
TextFieldParser
Sudah mencoba VB dan berhasil. Terima kasihparser.TextFieldType = FieldType.Delimited;
tidak diperlukan jika Anda meneleponparser.SetDelimiters(",");
, karena metode ini menentukanTextFieldType
properti untuk Anda."text with quote"", and comma"
, dan Anda bisa mendapatkan nilai yang benartext with quote", and comma
daripada nilai yang dipisahkan secara salah. Jadi, Anda mungkin ingin memilih String.Split jika Anda csv sangat sederhana.Pengalaman saya adalah bahwa ada banyak format csv yang berbeda. Khususnya bagaimana mereka menangani pelolosan kutipan dan pembatas dalam suatu bidang.
Ini adalah varian yang saya temui:
Saya telah mencoba banyak parser csv yang ada tetapi tidak ada satu pun yang dapat menangani varian yang saya temui. Juga sulit untuk mencari tahu dari dokumentasi yang lolos dari varian yang didukung parser.
Dalam proyek saya sekarang saya menggunakan VB TextFieldParser atau splitter kustom.
sumber
Saya merekomendasikan CsvHelper dari Nuget .
(Menambahkan referensi ke Microsoft.VisualBasic hanya merasa tidak benar, itu tidak hanya jelek, itu mungkin bahkan tidak lintas platform.)
sumber
CsvHelper
dilengkapi dengan baris bawaan untuk class mapper; itu memungkinkan untuk variasi dalam tajuk kolom (jika ada), dan bahkan variasi dalam tatanan kolom (meskipun saya sendiri belum menguji yang terakhir). Semua itu terasa jauh lebih "tingkat tinggi" daripadaTextFieldParser
.Kadang-kadang menggunakan perpustakaan itu keren ketika Anda tidak ingin menemukan kembali roda, tetapi dalam hal ini orang dapat melakukan pekerjaan yang sama dengan lebih sedikit baris kode dan lebih mudah dibaca dibandingkan dengan menggunakan perpustakaan. Ini adalah pendekatan berbeda yang menurut saya sangat mudah digunakan.
sumber
CSV bisa rumit nyata cepat.
Gunakan sesuatu yang kuat dan teruji dengan baik:
FileHelpers: www.filehelpers.net
sumber
Saya menggunakan ini di sini:
http://www.codeproject.com/KB/database/GenericParser.aspx
Terakhir kali saya mencari sesuatu seperti ini, saya menemukannya sebagai jawaban untuk pertanyaan ini .
sumber
Satu lagi ke daftar ini, Cinchoo ETL - perpustakaan open source untuk membaca dan menulis file CSV
Untuk contoh file CSV di bawah ini
Dengan cepat Anda dapat memuatnya menggunakan pustaka seperti di bawah ini
Jika Anda memiliki kelas POCO yang cocok dengan file CSV
Anda dapat menggunakannya untuk memuat file CSV seperti di bawah ini
Silakan periksa artikel di CodeProject tentang cara menggunakannya.
Penafian: Saya penulis perpustakaan ini
sumber
sumber
Pertama-tama perlu memahami apa itu CSV dan bagaimana cara menulisnya.
/r/n
) adalah baris "tabel" berikutnya.\t
atau,
/r/n
simbol (sel harus mulai dengan simbol tanda kutip dan diakhiri dengan simbol ini dalam kasus ini)Cara termudah untuk C # / Visual Basic untuk bekerja dengan file CSV adalah dengan menggunakan
Microsoft.VisualBasic
perpustakaan standar . Anda hanya perlu menambahkan referensi yang diperlukan, dan string berikut ke kelas Anda:Ya, Anda bisa menggunakannya dalam C #, jangan khawatir. Pustaka ini dapat membaca file yang relatif besar dan mendukung semua aturan yang diperlukan, sehingga Anda dapat bekerja dengan semua file CSV.
Beberapa waktu lalu saya menulis kelas sederhana untuk CSV baca / tulis berdasarkan perpustakaan ini. Menggunakan kelas sederhana ini Anda akan dapat bekerja dengan CSV seperti dengan array 2 dimensi. Anda dapat menemukan kelas saya dengan tautan berikut: https://github.com/ukushu/DataExporter
Contoh sederhana menggunakan:
sumber
Untuk menyelesaikan jawaban sebelumnya, orang mungkin perlu koleksi objek dari File CSV-nya, baik diuraikan oleh
TextFieldParser
ataustring.Split
metode, dan kemudian setiap baris dikonversi ke objek melalui Refleksi. Anda jelas harus terlebih dahulu mendefinisikan kelas yang cocok dengan garis-garis file CSV.Saya menggunakan Serializer CSV sederhana dari Michael Kropat yang ditemukan di sini: Kelas generik ke CSV (semua properti) dan menggunakan kembali metodenya untuk mendapatkan bidang dan properti dari kelas yang diinginkan.
Saya deserialize file CSV saya dengan metode berikut:
sumber
Saya sangat menyarankan menggunakan CsvHelper.
Ini contoh singkatnya:
Dokumentasi lengkap dapat ditemukan di: https://joshclose.github.io/CsvHelper
sumber