Saya mencoba menulis ke csv
file baris demi baris menggunakan bahasa C #. Inilah fungsi saya
string first = reader[0].ToString();
string second=image.ToString();
string csv = string.Format("{0},{1}\n", first, second);
File.WriteAllText(filePath, csv);
Seluruh fungsi berjalan di dalam satu lingkaran, dan setiap baris harus ditulis ke csv
file. Dalam kasus saya, baris berikutnya menimpa baris yang ada dan pada akhirnya, saya mendapatkan satu-satunya catatan dalam file csv yang merupakan yang terakhir. Bagaimana saya bisa menulis semua baris dalam csv
file?
StringBuilder
dan kemudian membuat satu menyimpan?Util.WriteCsv (mydatacollection, @"c:\temp\data.csv");
Jawaban:
MEMPERBARUI
Kembali di hari-hari naif saya, saya menyarankan melakukan ini secara manual (itu adalah solusi sederhana untuk pertanyaan sederhana), namun karena ini menjadi lebih dan lebih populer, saya akan merekomendasikan menggunakan perpustakaan CsvHelper yang melakukan semua pemeriksaan keamanan, dll.
CSV jauh lebih rumit daripada yang disarankan pertanyaan / jawaban.
Jawaban Asli
Karena Anda sudah memiliki perulangan, pertimbangkan untuk melakukannya seperti ini:
Atau sesuatu untuk efek ini. Alasan saya adalah: Anda tidak perlu menulis ke file untuk setiap item, Anda hanya akan membuka aliran sekali dan kemudian menulis untuk itu.
Anda bisa mengganti
dengan
jika Anda ingin menyimpan versi csv sebelumnya di file yang sama
C # 6
Jika Anda menggunakan c # 6.0 maka Anda dapat melakukan hal berikut
EDIT
Berikut ini tautan ke pertanyaan yang menjelaskan apa yang
Environment.NewLine
dilakukan.sumber
{2}
danEnvironment.NewLine
dan menggunakanAppendLine
bukannyaAppend
System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator
alih-alih koma.Saya akan sangat menyarankan Anda untuk pergi ke rute yang lebih membosankan. Apalagi jika ukuran file Anda besar.
File.AppendAllText()
membuka file baru, menulis konten dan kemudian menutup file. Membuka file adalah operasi yang banyak sumber daya, daripada menulis data ke aliran terbuka. Membuka \ menutup file di dalam satu loop akan menyebabkan penurunan kinerja.Pendekatan yang disarankan oleh Johan memecahkan masalah itu dengan menyimpan semua output dalam memori dan kemudian menulisnya sekali. Namun (dalam kasus file besar) program Anda akan mengkonsumsi sejumlah besar RAM dan bahkan crash
OutOfMemoryException
Keuntungan lain dari solusi saya adalah Anda dapat menerapkan jeda \ melanjutkan dengan menyimpan posisi saat ini dalam data input.
upd. Ditempatkan menggunakan di tempat yang tepat
sumber
using
pernyataan. Kalau tidak, Anda akan membuka kembali file sepanjang waktu berulang-ulang.Menulis file csv dengan tangan bisa jadi sulit karena data Anda mungkin mengandung koma dan baris baru. Saya sarankan Anda menggunakan perpustakaan yang ada sebagai gantinya.
Pertanyaan ini menyebutkan beberapa opsi.
Apakah ada perpustakaan CSV pembaca / penulis di C #?
sumber
Saya menggunakan solusi dua parse karena sangat mudah dipelihara
sumber
File.AppendAllLines(filePath, lines, Encoding.ASCII);
bukanFile.WriteAllText(filePath, csv.ToString());
Jadi, saya melakukan sesuatu yang sangat kikuk. Setelah membuat csv menggunakan StringBuilder, saya mengonversinya menjadi Daftar <string> untuk mendapatkan IEnumerable untuk panggilan ke AppendAllLines, yang tidak akan menerima csv.ToString () sebagai parameter:List<string> lines = new List<string>(); lines.Add(csv.ToString(0, csv.Length));
Apakah Anda memiliki cara yang lebih baik untuk melakukan ini?Alih-alih menelepon setiap kali
AppendAllText()
Anda bisa berpikir tentang membuka file sekali dan kemudian menulis seluruh konten sekali:sumber
Cukup gunakan AppendAllText sebagai gantinya:
Satu-satunya downside dari AppendAllText adalah ia akan membuang kesalahan ketika file tidak ada, jadi ini harus diperiksaMaaf, momen pirang sebelum membaca dokumentasi . Bagaimanapun, metode WriteAllText menimpa apa pun yang sebelumnya ditulis dalam file, jika file itu ada.
Perhatikan bahwa kode Anda saat ini tidak menggunakan baris baru yang tepat, misalnya di Notepad Anda akan melihat semuanya sebagai satu baris panjang. Ubah kode ini menjadi baris baru yang benar:
sumber
Alih-alih menciptakan kembali roda perpustakaan dapat digunakan.
CsvHelper
sangat bagus untuk membuat dan membaca file csv. Operasi baca dan tulisnya berbasis aliran dan karenanya mendukung operasi dengan sejumlah besar data.Anda dapat menulis csv Anda seperti berikut ini.
Karena perpustakaan menggunakan refleksi, ia akan mengambil jenis apa pun dan menguraikannya langsung.
Jika Anda ingin membaca lebih lanjut tentang konfigurasi dan kemungkinan perpustakaan, Anda dapat melakukannya di sini .
sumber
sumber
.Replace(",", ";") + ','
:?Menangani Koma
Untuk menangani koma di dalam nilai saat menggunakan
string.Format(...)
, yang berikut ini telah berfungsi untuk saya:Jadi untuk menggabungkannya dengan jawaban Johan, akan terlihat seperti ini:
Mengembalikan File CSV
Jika Anda hanya ingin mengembalikan file alih-alih menulisnya ke lokasi, ini adalah contoh bagaimana saya menyelesaikannya:
Dari Prosedur yang Disimpan
Dari Daftar
Semoga ini bermanfaat.
sumber
Ini adalah tutorial sederhana tentang cara membuat file csv menggunakan C # yang dapat Anda edit dan perluas sesuai kebutuhan Anda.
Pertama, Anda harus membuat aplikasi konsol Visual Studio C # baru, ada langkah-langkah yang harus diikuti untuk melakukan ini.
Contoh kode akan membuat file csv bernama MyTest.csv di lokasi yang Anda tentukan. Isi file harus 3 kolom bernama dengan teks di 3 baris pertama.
https://tidbytez.com/2018/02/06/how-to-create-a-csv-file-with-c/
sumber
Anda mungkin hanya perlu menambahkan umpan baris
"\n\r"
.sumber
Berikut ini adalah pustaka sumber terbuka lainnya untuk membuat file CSV dengan mudah, Cinchoo ETL
Untuk informasi lebih lanjut, silakan baca artikel CodeProject tentang penggunaan.
sumber
Salah satu cara sederhana untuk menyingkirkan masalah penimpaan adalah dengan menggunakan
File.AppendText
untuk menambahkan baris pada akhir file sebagaisumber
string string_value = string.Empty;
sumber
Ini akan memungkinkan Anda untuk menulis file csv dengan cukup sederhana. Pemakaian:
sumber