2015-04-23 7 views
0

Я создаю систему, которая включает в себя создание CSV для регистрации ошибок.Как вставить новую строку в файл CSV?

Мой текущий код успешно создает новый файл с уникальным именем, а затем добавляет существующие данные (из массива) в CSV. Проблема, с которой я сталкиваюсь, заключается в добавлении в файл новых строк, необходимых для поддержания правильной структуры.

Мой существующий код:

$current = file_get_contents($fileName); 
foreach($error as $err) { 
    foreach($err as $title => $info) { 
     $current .= $info . ','; 
    } 
    $current .= "\n"; 
} 
file_put_contents($fileName, $current); 

var_dump моей структуры массива для $error выглядит следующим образом:

array (size=3) 
    0 => 
    array (size=4) 
     'id' => string '1' (length=6) 
     'name' => string 'Kyle Katarn' (length=19) 
     'qty' => string '1' (length=3) 
     'date' => string '' (length=0) 
    1 => 
    array (size=4) 
     'id' => string '2' (length=6) 
     'name' => string 'Dash Rendar' (length=23) 
     'qty' => string '1' (length=2) 
     'date' => string '' (length=0) 
    2 => 
    array (size=4) 
     'id' => string '3' (length=6) 
     'name' => string 'Mara-Jade' (length=24) 
     'qty' => string '1' (length=2) 
     'date' => string '' (length=0) 

Я посмотрел на самых различных SO вопросов, и никто не решил эту проблему. Любая помощь будет оценена по достоинству.

+1

Лучшее использование putcsv(); –

ответ

3

Как говорили другие, используйте PHP_EOL для создания новой строки.

Однако, я хотел бы использовать fputcsv себя, чтобы обеспечить содержание были правильно заключены:

function generateCsv(array $data, $filename, $delimiter = ',', $enclosure = '"') { 
    $handle = fopen($filename, 'r+'); 
    foreach ($data as $line) { 
     fputcsv($handle, $line, $delimiter, $enclosure); 
    } 
    rewind($handle); 
    $contents = ''; 
    while (!feof($handle)) { 
     $contents .= fread($handle, 8192); 
    } 
    fclose($handle); 
    return $contents; 
} 

// usage 
echo generateCsv($data, '/path/to/file.csv'); 

// or just save the csv to file: 
generateCsv($data, '/path/to/file.csv'); 

Эта функция, а также сохранение в формате CSV для $filename также возвращает сгенерированный файл CSV в виде строки, если вы представляете echo ИНГ Это.

+0

Это хороший ответ. –

5

Используйте платформонезависимое глобальную PHP_EOL

1

Вы должны иметь пробелы в начале полей только тогда, когда космические символы являются частью данных. Excel не будет удалять ведущие пробелы. Вы получите нежелательные пробелы в заголовках и полях данных. Хуже того, «что должно быть« защищено », что разрыв строки в третьем столбце будет проигнорирован, потому что он не находится в начале поля.

Если у вас есть символы, отличные от ASCII (закодированные в UTF-8) в файле вы должны иметь спецификацию UTF-8 (3 байта, шестнадцатеричный EF BB BF) в начале файла. В противном случае Excel будет интерпретировать данные в соответствии с кодировкой по умолчанию вашего языка (например, cp1252) вместо utf-8, . и ваши не-ASCII символы будут перемещены в корзину

После замечания относятся к Excel 2003, 2007 и 2013 годах, не тестируется на Excel 2000

Если открыть файл, дважды щелкнув на его имени в Windows Explorer, все работает нормально.

Если открыть его в Excel, результаты бывают разные:

You have only ASCII characters in the file (and no BOM): works. 
You have non-ASCII characters (encoded in UTF-8) in the file, with a UTF-8 BOM at the start: it recognises that your data is encoded in UTF-8 but it ignores the csv extension and drops you into the Text Import not-a-Wizard, unfortunately with the result that you get the line-break problem. 

Варианты включают в себя:

Train the users not to open the files from within Excel :-(
Consider writing an XLS file directly ... there are packages/libraries available for doing that in Python/Perl/PHP/.NET/etc 
2

Я думаю, вы можете извлечь выгоду из использования PHP_EOL constant

Изменить существующий код РНР до:

$current = file_get_contents($fileName); 
foreach($error as $err) { 
    foreach($err as $title => $info) { 
     $current .= $info . ','; 
    } 
    $current .= PHP_EOL; 
} 
file_put_contents($fileName, $current); 
Смежные вопросы