2016-12-13 12 views
0

Я застрял с возвратом каретки и проблемой подачи строки. Когда я запускаю свой скрипт, он показывает CR, LF внутри двойной кавычки последнего поля, и есть еще один LF после этого, реалистично CR, LF должен быть вне двойной цитаты текста, и не должно быть другого LF. Может кто-нибудь сказать мне, что я делаю неправильно?Возврат каретки и подача линии

Вот мой код

$jobno = 5285; 

$directory = "../CSV/"; 
$filename = $jobno.'.csv'; 
if(is_dir($directory) === false) 
{ 
    mkdir($directory); // Create new directory 

} 
$newFname = $directory.$filename; 

$file = fopen($newFname, 'w'); 


$jobdetails="2,000 Items Supplied"; 
$customerName="Snap Pitzaa Ltd"; 
$workflow="CSV_wise"; 
$jobqty=50; 
$filepath="Data/Snap Pitzaa/design.pdf \r\n"; 

$data = array(
    array($jobno, $jobdetails, $customerName, $workflow, $jobqty, $filepath), 
    array('Data 21', 'Data 22', 'Data 23', 'Data 24', 'Data 25', 'Data 26'), 

); 

// save each row of the data 
foreach ($data as $row) 
{ 
    fputcsv($file, $row); 
} 

// Close the file 
fclose($file); 

Я пробовал все вещи, как одинарные кавычки, вне Даблхедера от $filepath, но ничего из этого не работает. Здесь выводится в блокноте ++

enter image description here

+0

lookout for unicode – Notepad

+0

Не будет меняться '$ filepath =" Data/Snap Pitzaa/design.pdf \ r \ n ";' to '$ filepath =" Data/Snap Pitzaa/design.pdf ";' fix it , т.е. удалить явный CR/LF, который вы включаете в строку? – YowE3K

+0

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

ответ

0

Только что дал себе введение в PHP (я никогда не использовал его раньше), я думаю, что следующий код будет правильно написать CR/LF в конце каждой записи вы пишете:

foreach ($data as $row) 
{ 
    // write out the normal output, with a LF automatically created by fputcsv 
    fputcsv($file, $row); 
    // move the file pointer back to the end of the data 
    fseek($file, -1, SEEK_CUR); 
    // write out a CR/LF 
    fwrite($file, "\r\n"); 
} 

вы должны также изменить

$filepath="Data/Snap Pitzaa/design.pdf \r\n"; 

к

$filepath="Data/Snap Pitzaa/design.pdf"; 

, поскольку не должно быть CR/LF внутри, что поле.

+0

Спасибо @ Джесси Банч вы оба показали мне правильную вещь, и это решило мою проблему. Спасибо, ребята, потратьте почти 3 часа, чтобы понять это, и без вашей помощи было бы невозможно. –

1

fputcsv завершается символом новой строки (docs). Поэтому вам не нужно добавлять \r\n в вашу переменную $filepath.

Это:

$filepath="Data/Snap Pitzaa/design.pdf \r\n";

Должен быть изменен следующим образом:

$filepath='Data/Snap Pitzaa/design.pdf';

Это должно удалить "CRLF" и переместить цитату, где вы хотите.

Редактировать 12/13/16

Вашего комментария, это звучит, как вам нужно заменить окончание строк Unix-стиль, что fputcsv выходов по умолчанию с окончаниями линии окна стиля. Самый элегантный способ я видел, чтобы сделать это было от this SO question:

// Writes an array to an open CSV file with a custom end of line. 
// 
// $fp: a seekable file pointer. Most file pointers are seekable, 
// but some are not. example: fopen('php://output', 'w') is not seekable. 
// $eol: probably one of "\r\n", "\n", or for super old macs: "\r" 
function fputcsv_eol($fp, $array, $eol) { 
    fputcsv($fp, $array); 
    if("\n" != $eol && 0 === fseek($fp, -1, SEEK_CUR)) { 
    fwrite($fp, $eol); 
    } 
} 
+0

Спасибо, Джесси за ваш ответ. Если я использую только строку, фид строки добавляется автоматически в конце, и это правильно, но этот новый сгенерированный файл автоматически выбирается другой программой (у меня нет контроля), когда она идет в CSV-папке, и она дает ошибку без CR и LF в конце, и если этот путь к файлу не окружен двойной кавычкой. –

+0

@ katya.lee см. Мое редактирование. Кажется, я знаю, о чем вы просите. –

+0

или просто добавить \ r к нему, просто используйте 'if (fseek ($ fp, -1, SEEK_CUR) === 0) fwrite ($ fp," \ r \ n ");' –