Saya memiliki formulir yang memungkinkan pengguna untuk mengunggah file teks atau menyalin / menempelkan konten file ke dalam textarea. Saya dapat dengan mudah membedakan antara keduanya dan menempatkan mana yang mereka masukkan ke dalam variabel string, tetapi ke mana saya pergi dari sana?
Saya perlu mengulangi setiap baris string (sebaiknya tidak khawatir tentang baris baru pada mesin yang berbeda), pastikan bahwa ia memiliki tepat satu token (tidak ada spasi, tab, koma, dll.), Membersihkan data, kemudian menghasilkan query SQL didasarkan dari semua lini.
Saya seorang programmer yang cukup baik, jadi saya tahu ide umum tentang bagaimana melakukannya, tetapi sudah lama saya bekerja dengan PHP sehingga saya merasa saya mencari hal-hal yang salah dan dengan demikian menghasilkan informasi yang tidak berguna. Masalah utama yang saya alami adalah bahwa saya ingin membaca isi string baris demi baris. Jika itu file, itu akan mudah.
Saya sebagian besar mencari fungsi PHP yang berguna, bukan algoritma untuk melakukannya. Ada saran?
s($myString)->normalizeLineEndings()
ini tersedia dengan github.com/delight-im/PHP-Str (perpustakaan di bawah Lisensi MIT) yang memiliki banyak pembantu string berguna lainnya. Anda mungkin ingin melihat kode sumbernya.Jawaban:
preg_split
variabel yang berisi teks, dan beralih di atas array yang dikembalikan:sumber
/((\r?\n)|(\r\n?))/
./((\r?\n)|(\n?\r))/
Saya ingin mengusulkan alternatif yang jauh lebih cepat (dan hemat memori):
strtok
daripadapreg_split
.Menguji kinerja, saya mengulangi 100 kali lebih dari file uji dengan 17 ribu baris:
preg_split
butuh 27,7 detik, sedangkanstrtok
butuh 1,4 detik.Perhatikan bahwa meskipun
$separator
didefinisikan sebagai"\r\n"
,strtok
akan terpisah pada salah satu karakter - dan pada PHP4.1.0, lewati baris kosong / token.Lihat entri manual strtok: http://php.net/strtok
sumber
prey_split
juga tidakexplode
boleh digunakan untuk menghasilkan fragmen string terstruktur. Ini seperti membidik seekor lalat dengan bazoka .strtok()
sesuatu yang lain di dalamwhile
loop itu akan merusak banyak hal. Saya juga menggunakannya untuk mengambil semuanya dalam string hingga ke ruang pertama ( stackoverflow.com/a/2477411/1767412 ) dan butuh waktu sebentar untuk menyadari mengapa semuanya tidak berjalan seperti yang direncanakanJika Anda perlu menangani baris baru dalam sistem yang berbeda, Anda cukup menggunakan konstanta PHP yang telah ditentukan, PHP_EOL (http://php.net/manual/en/reserved.constants.php) dan cukup menggunakan meledak untuk menghindari overhead mesin ekspresi reguler .
sumber
PHP_EOL (string)
adalah yang benar 'End Of Line simbol untuk ini platform yang.Ini terlalu rumit dan jelek tapi menurut saya ini adalah cara untuk pergi:
sumber
php://temp
untuk menyimpan data yang lebih besar ke file disk sementara.^ beginilah cara Anda mematahkan garis dengan benar , kompatibel dengan lintas platform
Regexp
:)sumber
Masalah memori potensial dengan
strtok
:Karena salah satu solusi yang disarankan digunakan
strtok
, sayangnya itu tidak menunjukkan masalah memori potensial (meskipun diklaim sebagai memori efisien). Bila menggunakanstrtok
sesuai dengan manual , yang:Ini dilakukan dengan memuat file ke dalam memori. Jika Anda menggunakan file berukuran besar, Anda perlu membilasnya jika Anda sudah selesai memutarnya.
Jika Anda hanya peduli dengan file fisik (mis. Datamining):
Menurut manual , untuk bagian unggahan file Anda dapat menggunakan
file
perintah:sumber
Jawaban Kyril paling baik mengingat Anda harus dapat menangani baris baru pada mesin yang berbeda.
Saya sering menggunakan ini:
sumber