المشكلة مع PHP قراءة ملفات CSV
سؤال
وأنا أحاول قراءة البيانات من a.csv الملف إلى ouput على صفحة ويب كنص.
وهذه هي المرة الأولى التي أفعل هذا ولقد واجهت مشكلة صغيرة سيئة.
وبلدي ملف .csv (الذي يحصل على openened بواسطة Excel افتراضيا)، له عدة صفوف وقرأت الشيء بأكمله كسلسلة واحدة طويلة.
ومثل هذا:
$contents = file_get_contents("files/data.csv");
في هذا المثال ملف أدليت به، وهناك 2 خطوط.
<اقتباس فقرة>وبول Blueberryroad 85 لنا المصباح، حقيبة نوفمبر 20، 2008، 16:39
وهيلين Blueberryroad 85 لنا lens13mm، ومضيا، حقيبة، ExtraBatteries نوفمبر 20، 2008، 16:41:32
اقتباس فقرة>ولكن سلسلة قرأه PHP هو:
وبولس. Blueberryroad 85، لنا، مصباح يدوي، حقيبة، 20 نوفمبر 2008، 04:39 pmHellen، Blueberryroad 85، لنا، lens13mm، ومضيا، حقيبة، ExtraBatteries، 20 نوفمبر 2008، 16:41:32
وأنا تقسيم هذا مع:
list($name[], $street[], $country[], $accessories[], $orderdate[]) = split(";",$contents);
ما أريده هو اسم $ [] لاحتواء "بول" و "هيلين" كما محتوياته. والمصفوفات الأخرى في الحصول على قيم الأعمدة الخاصة بكل منها.
وبدلا من ذلك يمكنني الحصول على بول فقط ومضمون $ تاريخ الطلب [] هو
<اقتباس فقرة>و20 نوفمبر 2008، 04:39 pmHellen
اقتباس فقرة>وهكذا يتم متصلا كافة الصفوف. يمكن للشخص أن تريني كيف يمكن تحقيق ما أحتاج إليه؟
وتحرير: وجدت الحل، شيء واحد فقط werid المتبقية:
ولقد حلها الآن باستخدام هذه القطعة من التعليمات البرمجية:
$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
$contents[] = fgetcsv($fo,0,';');
}
fclose($fo);
لسبب ما، اللثوغ ملف CSV بلدي لديه سوى 2 الصفوف، فإنها ترجع 2 المصفوفات و1 منطقية. أول 2 هي صفائف البيانات الخاصة بي ومنطقية هو 0.
المحلول
وأنت أفضل حالا باستخدام fgetcsv () الذي هو على بينة من بنية ملف CSV وخصصت الخيارات للتعامل مع ملفات CSV. بدلا من ذلك، يمكنك استخدام str_getcsv () على محتويات الملف بدلا من ذلك.
نصائح أخرى
الملف () وظيفة يقرأ ملف في مجموعة، كل سطر هو دخول صفيف.
وهكذا يمكنك أن تفعل شيئا مثل:
$rows = array();
$name = array();
$street = array();
$country = array();
$rows = file("file.csv");
foreach($rows as $r) {
$data = explode(";", $r);
$name[] = $data[0];
$street[] = $data[1];
$country[] = $data[2];
}
ولقد حلها الآن باستخدام هذه القطعة من التعليمات البرمجية:
$fo = fopen("files/users.csv", "rb+");
while(!feof($fo)) {
$contents[] = fgetcsv($fo,0,';');
}
fclose($fo);
لسبب ما، اللثوغ ملف CSV بلدي لديه سوى 2 الصفوف، فإنها ترجع 2 المصفوفات و1 منطقية. أول 2 هي صفائف البيانات الخاصة بي ومنطقية هو 0.
وهذه الملاحظة حول fgetcsv صحيحة.
وأنا سوف لا تزال الإجابة على سؤالك، لأغراض تعليمية. أول شيء، أنا لا أفهم الفرق بين البيانات الخاصة بك (مع الغيبوبة)، و "سلسلة قرأه PHP" (ومن البدائل بعض المساحات مع منقوطة، ولكن ليس كل شيء؟). PS: نظرت إلى رمز مصدر الرسالة، فإنه يبدو وكأنه مزيج غريب من TSV (علامات) وCSV (غيبوبة).
والى جانب ذلك، إذا كنت ترغب في السير في هذا الطريق، تحتاج إلى تقسيم أول ملف في الخطوط، ثم الخطوط في الحقول.
وأفضل طريقة هي بالطبع fgetcsv () كما أشار.
$f = fopen ('test.csv', 'r');
while (false !== $data = fgetcsv($f, 0, ';'))
$arr[] = $data;
fclose($f);
ولكن إذا كان لديك محتويات متغير وتريد تقسيمه، وstr_getcsv غير متوفر يمكنك استخدام هذا:
function str_split_csv($text, $seperator = ';') {
$regex = '#' . preg_quote($seperator) . '|\v#';
preg_match('|^.*$|m', $text, $firstline);
$chunks = substr_count($firstline[0], $seperator) + 1;
$split = array_chunk(preg_split($regex, $text), $chunks);
$c = count($split) - 1;
if (isset($split[$c]) && ((count($split[$c]) < $chunks) || (($chunks == 1) && ($split[$c][0] == ''))))
unset($split[$c]);
return $split;
}