Разделитель PHP fgetcsv()

Что касается документации fgetcsv(), внутри функции fgetcsv() есть несколько параметров: дескриптор, длина, разделитель, ограждение и побег.

Теперь у меня есть 2 вопроса:

  1. Что именно делает корпус?
  2. У меня есть файл csv с 5 столбцами в строке. Представьте себе это примерно так: 1,2,3,4,5

Итак, индексы от 0 до 4. Но всякий раз, когда я хочу получить дату из индекса 4, возвращается пустое значение. Если я не поставлю запятую после него (заполнив дополнительный столбец после него, что сделает содержимое таким: 1,2,3,4,5,6 ). Как я могу решить эту проблему? Кажется, есть какая-то проблема из-за отсутствия запятой после последнего элемента в каждой строке CSV-файла!


person Mohammad Saberi    schedule 22.08.2012    source источник
comment
Не могли бы вы вставить файл csv куда-нибудь? И, возможно, покажите нам какую-нибудь важную часть вашего кода.   -  person j0k    schedule 22.08.2012


Ответы (3)


1. Параметр enclosure — это символ, который инкапсулирует данные для определенного поля или «индекса». По умолчанию параметр равен ", что означает, что вы можете «заключить» строки в " символов.

Пример:

1,2,"this is three",4


2. За комментарий вы звоните fgetcsv($handle, 10000, ','). Возможно, строки, которые вы читаете, длиннее 10000 символов. Попробуйте изменить длину на 0, что будет «без ограничений», и посмотрите, поможет ли это. Другим решением было бы попытаться заключить значение столбца в двойные кавычки.

person newfurniturey    schedule 22.08.2012
comment
Я читаю строки, используя while (($data = fgetcsv($handle, 10000, ',')) !== FALSE) {, и извлекаю их значения, такие как $title = $data[0]; - person Mohammad Saberi; 22.08.2012

Вложение — это символ, вмещающий поле. Это своего рода дополнительный разделитель.

Например, hello,world имеет запятую в качестве разделителя полей и не имеет текстового разделителя, а "hello","world" имеет знак кавычек в качестве текстового разделителя. Некоторые системы используют значения с разделителями и без ограничений для обозначения текстовых и числовых полей соответственно (я полагаю, что это делает Microsoft Excel). Это позволяет полю содержать разделитель поля в своем значении:

"Hello,world","Second Field","Third, and last, field".

Некоторые другие системы заключают только значения, содержащие разделитель полей, или значения, содержащие пробелы, что означает, что в этих системах неограниченное значение не обязательно является числовым.

Если у вас есть «тривиальный» случай — неограниченные значения, без экранированных разделителей полей внутри значений (т. е. без «A, firstpartB \, secondpartB, C») — вы можете вообще пропустить преобразование CSV и запустить

  $line = fgets($file, MAX_EXPECTED_LINE_LEN);
  // This splits '  A, B, C ' into 'A', ' B' and ' C' (note spaces)
  $row = explode(',', trim($line)); // other delimiters can be used

or

  // Consider "  , ", "," and ", " as the same delimiter
  // i.e. ' Alpha , Beta   ,    Gamma  ' gets split into 'Alpha', 'Beta' and 'Gamma'
  $row = preg_split('#\\s*,\\s*#', trim($line));

Кажется, я не могу воспроизвести проблему, с которой вы столкнулись; может ли это быть связано с другим кодированием концов строк (например, CRLF вместо LF)?

В крайнем случае, вы можете разделить fgetcsv на два компонента fgets и str_getcsv(), манипулируя строкой между вызовами (с помощью trim или, в худшем случае, добавив пропущенную запятую).

person LSerni    schedule 22.08.2012

У меня работает так:

while ($row = $stmt -> fecht()){
     echo "\"";
     echo $row['email'];
     echo "\"";
     // Export every row to a file
     $arr = array(',');
     fputcsv($data, $arr, ";", '"' );
}
person Fábio Dutra    schedule 08.12.2015