Возврат каретки и перевод строки

Я застрял с проблемой возврата каретки и перевода строки. Когда я запускаю свой скрипт, он показывает 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, но ничего из этого не работает. Вот вывод в notepad++

введите здесь описание изображения


person katya.lee    schedule 13.12.2016    source источник
comment
искать юникод   -  person Notepad    schedule 13.12.2016
comment
Разве изменение $filepath="Data/Snap Pitzaa/design.pdf \r\n"; на $filepath="Data/Snap Pitzaa/design.pdf"; не исправит это, т.е. удалит явный CR/LF, который вы включаете в строку?   -  person YowE3K    schedule 13.12.2016
comment
спасибо за предложение, не могли бы вы прочитать мой комментарий ниже, потому что вы оба предлагаете мне одно и то же, и в определенном смысле это правильно.   -  person katya.lee    schedule 14.12.2016


Ответы (2)


Только что познакомившись с 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";

to

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

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

person YowE3K    schedule 14.12.2016
comment
Спасибо @Jesse Bunch, вы оба показали мне правильные вещи, и это решило мою проблему. Спасибо, ребята, потратил почти 3 часа, чтобы понять это, и без вашей помощи это было бы невозможно. - person katya.lee; 14.12.2016

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

Этот:

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

Следует изменить на это:

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

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

Изменить 13.12.16

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

// 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);
  }
}
person Jesse Bunch    schedule 13.12.2016
comment
Спасибо Джесси за ваш ответ. Если я использую только строку, перевод строки добавляется автоматически в конце, и это правильно, но этот новый сгенерированный файл автоматически подхватывается другой программой (которую я не могу контролировать), как только он попадает в папку CSV, и выдает ошибку без CR и LF в конце, и если этот путь к файлу не заключен в двойные кавычки. - person katya.lee; 14.12.2016
comment
@katya.lee смотрите мою правку. Кажется, я знаю, о чем вы просите. - person Jesse Bunch; 14.12.2016
comment
или просто добавить к нему \r, просто используйте if (fseek($fp, -1, SEEK_CUR) === 0) fwrite($fp, "\r\n"); - person Erick Robertson; 09.03.2017