2016-01-18 1 views
2

Я хочу прочитать файл данных CSV, загрузить его в массив, отредактировать его и записать в файл. Я смог выполнить эту единственную итерацию с примерами здесь, на Stackoverflow! Благодарю.PHP писать в файл без последней новой строки

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

Пример # 1:

foreach($editArray as $row) { 
    $writeStuff = implode(",", $row); 
    fwrite($file_handle, $writeStuff); 
    fwrite($file_handle, "\n"); 
} 

Пример № 2:

foreach ($editArray as $row) { 
    fputcsv($file_handle, $row); 
} 

Это оригинальный CSV данные:

 
1/1/16,Yes,No 
1/2/16,No,Yes 

При записи с использованием выше него производит эти данные с добавленная строка новой строки:

 
1/1/16,Yes,No 
1/2/16,No,Yes 

Эта дополнительная новая строка создает проблему при чтении файла во второй раз. Я получаю сообщение об ошибке как на fputcsv(), так и на implode(). Я считаю, что это потому, что пустой индекс вызван новой строкой, когда я читаю файл во второй раз после первой записи.

Я мог бы использовать цикл for с условным номером в последнем fwrite() в примере implode() Пример №1, но это казалось бы неуклюжим и не способ сделать это.

Возможно, существует совершенно другой способ справиться с этим?

+0

Как вы прочитали этот файл? – AbraCadaver

+0

Я не вижу никакого способа добавить дополнительную строку новой строки, если последний элемент '$ editArray' не заканчивается новой строкой, а другие элементы - нет. – Barmar

+0

В первом примере вы явно пишете новую строку в последнем утверждении. Это причина, по которой вы получаете дополнительную новую строку в конце? – Svea

ответ

2

Это ожидаемое поведение fputcsv

fputcsv() форматирует строку (передается как массив полей) в формате CSV и записать его (завершенного переводом строки) до указанного дескриптора файла.

Учитывая то, что все строки заканчиваются символом новой строки, вы будете иметь дополнительную пустую строку в конце файла

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

+0

Спасибо вам обоим отзывам. После проверки рекомендации перед обработкой я придумал два решения. –

1

Если вы хотите, чтобы предотвратить добавление новой строки в конце файла, вы можете создать свой набор данных с новыми линиями, где их нужно (и где вы не), а затем записать его однажды:

$writeStuff = []; 
foreach($editArray as $row) { 
    $writeStuff[] = implode(',', $row); 
} 
fwrite($file_handle, implode(PHP_EOL, $writeStuff)); 

Кроме того, я не знаю, как вы загрузите файл, но вы всегда можете пропустить пустые строки - вот пример:

$editArray = file('your_filename.csv', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); 
0

Основываясь на рекомендации, я искал решение при чтении и погрузка файл, а не когда я написал файл.

Это те решения, которые я придумал.

Первый вариант:

while(! feof($file_handle)) { 
    $tmp = fgetcsv($file_handle); 
    if($tmp != NULL) { 
     $myArray[] = $tmp; 
    } 
} 

fgetcsv возвращает NULL, если строка пуста.

Второй вариант. Отключите fgetcsv() для файла(). Он игнорирует пустую новую строку без тестирования.

$data_Array = file($file); 

foreach($$data_Array as $key) { 
    $myArray[] = explode(",", $key); 
} 

Это похоже на работу. Кроме того, пример, приведенный ранее с помощью implode() и PHP_EOL, также работает. Возможно, мне что-то не хватает, но пока они работают.