2015-04-11 5 views
3

Я импорт CSV с помощью PHP и так как CSV иногда может быть большим, что я делаю так потоковым файлу 4096 байт, в то время с помощью следующего кода:PHP fgetcsv и пользовательский символ конца строки

if(($handle = fopen($file, 'r')) !== false) 
    { 
     // loop through the file line-by-line 
     while(($data = fgetcsv($handle)) !== false) 
     { 
      echo var_dump($data); 
      unset($data); 
     } 
     fclose($handle); 
    } 
    else 
    { 
     echo "unable to open file $file <br>"; 
    } 

Некоторые из csvs имеют нестандартный символ окончания строки ';' и мне нужно указать строку, заканчивающуюся вручную, чтобы fgetcsv правильно получал каждую строку csv.

Я прочитал другие решения, которые предлагают использовать INI настройки:

ini_set("auto_detect_line_endings", true); 

Но это не решило проблему я получаю здесь.

Предыдущее решение этой проблемы состояло в том, чтобы получить весь файл и изменить все нестандартные концы строк и заменить их возвратом каретки и линейными каналами. Это решение больше недействительно по мере увеличения размера csvs.

То, что я получаю в дампе var, - это все строки csv, а не одна строка csv. Пример строки из CSV:

"col1,col2,col3,col4,col5;col1,col2,col3,col4,col5;col1,col2,col3,col4,col5;" 
+0

Пожалуйста, покажите небольшой пример того, как выглядит ваш файл csv – Rizier123

ответ

4

Поскольку fgetcsv() не имеет средство, чтобы изменить окончание строки, вы можете альтернативно прочитать файл с stream_get_line() до разделителя, а затем разобрать строку с str_getcsv()

// Given a delimiter... 
$delimiter = ";"; 

if(($handle = fopen($file, 'r')) !== false) { 
    // Read the line up to the delimiter 
    while ($line = stream_get_line($handle, 4096, $delimiter)) { 
    // Parse the CSV line into an array 
    $data = str_getcsv($line); 
    var_dump($data); 
    } 
    fclose($handle); 
} 
+0

Это отлично подходит для решения. Учитывая, что stream_get_line и str_getcsv работают с файлом с ограниченной длиной ввода, я вижу, как это решение будет продолжать работать даже с большими файлами, такими как предназначенные. Спасибо за помощь! – KenEucker

+0

@KenEucker Рад помочь, удачи. 'stream_get_line()' работает точно так же, как 'fgets()' (на котором основан 'fgetcsv()'), так что да, он должен хорошо работать с большими файлами. –