PHP fgetcsv() разделител

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

Сега имам 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, ','). Възможно е редовете, които четете, да са по-дълги от 10 000 знака. Опитайте да промените дължината на 0, което ще бъде „без ограничение“ и вижте дали това помага. Друго решение би било да опитате да поставите стойността на колоната в двойни кавички.

person newfurniturey    schedule 22.08.2012
comment
Чета редове с помощта на while (($data = fgetcsv($handle, 10000, ',')) !== FALSE) { и извличам стойностите им като $title = $data[0]; - person Mohammad Saberi; 22.08.2012

Enclosure е символът, ограждащ полето. Това е един вид допълнителен разделител.

Например 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