سؤال

وأنا أحاول قراءة البيانات من 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;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top