Saya perlu membagi string menjadi baris baru di .NET dan satu-satunya cara saya tahu untuk membagi string adalah dengan metode Split . Namun itu tidak akan memungkinkan saya untuk (dengan mudah) membagi pada baris baru, jadi apa cara terbaik untuk melakukannya?
806
Jawaban:
Untuk membelah sebuah string, Anda perlu menggunakan overload yang membutuhkan array string:
Sunting:
Jika Anda ingin menangani berbagai jenis jeda baris dalam sebuah teks, Anda dapat menggunakan kemampuan untuk mencocokkan lebih dari satu string. Ini akan terpecah dengan benar pada kedua jenis jeda baris, dan mempertahankan baris kosong dan spasi dalam teks:
sumber
Environment.NewLine
Properti berisi baris baru default untuk sistem. Untuk sistem Windows misalnya akan"\r\n"
.\n
meninggalkan sebuah\r
di akhir setiap baris, kemudian menampilkan garis dengan di\r\n
antara mereka.\r
dan\n
urutan (antara lain) memiliki arti khusus untuk kompiler C #. VB tidak memiliki urutan pelarian itu, jadi ada konstanta yang digunakan sebagai gantinya.Bagaimana dengan menggunakan
StringReader
?sumber
while
loop yang harus ditambahkan ke jawaban ini.Anda harus dapat memisahkan string dengan cukup mudah, seperti:
sumber
Cobalah untuk menghindari menggunakan string. Letakkan untuk solusi umum, karena Anda akan menggunakan lebih banyak memori di mana pun Anda menggunakan fungsi - string asli, dan salinan split, keduanya dalam memori. Percayalah bahwa ini bisa menjadi masalah besar ketika Anda mulai skala - menjalankan aplikasi pemrosesan batch 32-bit memproses 100MB dokumen, dan Anda akan menemukan delapan thread bersamaan. Bukannya aku pernah ke sana sebelumnya ...
Sebaliknya, gunakan iterator seperti ini;
Ini akan memungkinkan Anda untuk melakukan loop yang lebih efisien dalam memori di sekitar data Anda;
Tentu saja, jika Anda ingin semuanya dalam memori, Anda dapat melakukan ini;
sumber
blah.SplitToLines..
misdocument.SplitToLines...
?this
parameter formal menjadikannya metode ekstensi.Berdasarkan jawaban Guffa, di kelas ekstensi, gunakan:
sumber
Untuk variabel string
s
:Ini menggunakan definisi akhir garis dari lingkungan Anda. Pada Windows, akhir baris adalah CR-LF (carriage return, line feed) atau dalam karakter pelarian C #
\r\n
.Ini adalah solusi yang dapat diandalkan, karena jika Anda menggabungkan kembali garis dengan
String.Join
, ini sama dengan string asli Anda:Apa yang tidak dilakukan:
StringSplitOptions.RemoveEmptyEntries
, karena ini akan memecah markup seperti penurunan harga di mana baris kosong memiliki tujuan sintaksis.new char[]{Environment.NewLine}
, karena pada Windows ini akan membuat satu elemen string kosong untuk setiap baris baru.sumber
Regex juga merupakan opsi:
sumber
"\r?\n"
.Saya hanya berpikir saya akan menambahkan dua-bit saya, karena solusi lain pada pertanyaan ini tidak termasuk dalam klasifikasi kode yang dapat digunakan kembali dan tidak nyaman.
Blok kode berikut memperluas
string
objek sehingga tersedia sebagai metode alami ketika bekerja dengan string.Anda sekarang dapat menggunakan
.Split()
fungsi dari string apa pun sebagai berikut:Untuk membagi pada karakter baris baru, cukup lewati
"\n"
atau"\r\n"
sebagai parameter pembatas.Komentar: Alangkah baiknya jika Microsoft menerapkan kelebihan ini.
sumber
Environment.Newline
lebih disukai daripada hard-coding baik\n
atau\r\n
.Environment.Newline
adalah untuk kompatibilitas lintas platform, bukan untuk bekerja dengan file menggunakan penghentian baris yang berbeda dari sistem operasi saat ini. Lihat di sini untuk informasi lebih lanjut , jadi itu sangat tergantung pada apa yang dikerjakan pengembang. PenggunaanEnvironment.Newline
memastikan tidak ada konsistensi dalam jenis garis kembali antara OS, di mana 'hard-coding' memberikan kontrol penuh pengembang..Newline
bukan sihir, di bawah tenda itu hanya string seperti yang disediakan di atas berdasarkan saklar jika itu berjalan di unix, atau di windows. Taruhan paling aman, adalah pertama-tama melakukan pergantian string untuk semua "\ r \ n" dan kemudian berpisah pada "\ n". Di mana penggunaan.Newline
gagal, adalah ketika Anda bekerja dengan file yang disimpan oleh program lain yang menggunakan metode berbeda untuk jeda baris. Ini bekerja dengan baik jika Anda tahu setiap kali file dibaca selalu menggunakan jeda baris OS Anda saat ini.foo = foo.Replace("\r\n", "\n"); string[] result = foo.Split('\n');
. Apakah saya mengerti dengan benar bahwa ini berfungsi pada semua platform?Saat ini saya menggunakan fungsi ini (berdasarkan jawaban lain) di VB.NET:
Itu mencoba untuk membagi pada platform-lokal baris pertama terlebih dahulu, dan kemudian jatuh kembali ke setiap baris yang mungkin baru.
Saya hanya membutuhkan ini di dalam satu kelas sejauh ini. Jika itu berubah, saya mungkin akan membuat ini
Public
dan memindahkannya ke kelas utilitas, dan mungkin bahkan membuatnya menjadi metode ekstensi.Berikut cara menggabungkan garis cadangan, untuk ukuran yang baik:
sumber
"\r"
= kembali."\r\n"
= return + baris baru. (tinjau pos ini dan solusi yang diterima di siniNah, sebenarnya split harus dilakukan:
sumber
The RemoveEmptyStrings pilihan akan memastikan Anda tidak memiliki entri kosong karena \ n menyusul \ r
(Edit untuk mencerminkan komentar :) Perhatikan bahwa itu juga akan membuang baris kosong asli dalam teks. Ini biasanya yang saya inginkan tetapi mungkin bukan kebutuhan Anda.
sumber
Saya tidak tahu tentang Lingkungan. Garis Baru, tapi saya kira ini adalah solusi yang sangat bagus.
Usaha saya adalah:
.Trim tambahan menghapus semua \ r atau \ n yang mungkin masih ada (misalnya ketika di windows tetapi memisahkan string dengan os x karakter baris baru). Mungkin bukan metode tercepat.
EDIT:
Seperti yang ditunjukkan oleh komentar dengan benar, ini juga menghilangkan spasi putih di awal baris atau sebelum umpan baris baru. Jika Anda perlu mempertahankan spasi putih itu, gunakan salah satu opsi lain.
sumber
Jawaban konyol: menulis ke file sementara sehingga Anda dapat menggunakan yang terhormat
File.ReadLines
sumber
var
, karena tidak menentukan jenis variabel, jadi Anda mungkin tidak mengerti bagaimana menggunakan objek itu, atau apa yang diwakili objek itu. Plus, ini menunjukkan penulisan baris dan bahkan tidak menentukan nama file, jadi saya ragu itu akan berhasil. Kemudian, saat membaca, jalur ke file sekali lagi tidak ditentukan. Dengan asumsi bahwapath
adalahC:\Temp\test.txt
, Anda harus kemudian memilikistring[] lines = File.ReadLines(path);
.Path.GetTempFileName
msdn.microsoft.com/en-us/library/… dan mengatakan ia membuat file nol-byte & mengembalikan "path lengkap file itu". Saya bersumpah telah mencoba ini sebelumnya dan memberikan pengecualian karena tidak menemukan file, tetapi dikembalikan ke lokasi folder. Saya tahu argumen untuk menggunakanvar
, tetapi saya akan mengatakan itu TIDAK direkomendasikan karena tidak menunjukkan apa objek variabel. Itu mengaburkannya.sumber
Sangat mudah sebenarnya.
VB.NET:
C #:
sumber
Environment.NewLine
sama seperti di VB.