Написание файла CSV для пользователей Mac с PHP - PullRequest
0 голосов
/ 08 апреля 2010

Я использую общий алгоритм для записи файлов CSV, который теоретически работает для основных ОС. Тем не менее, клиент начал использовать Mac несколько недель назад, и они постоянно говорят мне, что файл CSV нельзя прочитать в Microsoft Excel 2008 для Mac 12.2.1.

В их ОС настроено использование точки с запятой; в качестве разделителя списка, который именно то, что я пишу в CSV. Они также говорят, что когда они открывают файл в блокноте, они заметили, что разрывов строки нет, все отображается в одной строке; вот почему Excel не может правильно прочитать файл; но в моем коде я использую межбраузерный разрыв строки \r\n

Это полный код, который я использую:

header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
// Output to browser with appropriate mime type, you choose ;)
header("Content-type: text/x-csv");
//header("Content-type: text/csv");
//header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=participantes.csv");

$separator = ";";
$rs = $sql->doquery("SELECT A QUERY TO RETRIEVE DATA FROM THE DB");

$header = "";
$num_fields = mysql_num_fields($rs);

for($i=0; $i<$num_fields; $i++){
  $field = mysql_field_name($rs, $i);
  $header .= $field.$separator;
}

echo $header."\r\n";

while($row = $sql->fetch($rs)){
  $str = "";
  for($i=0; $i<$num_fields; $i++){
    $field = mysql_field_name($rs, $i);
    $value = str_replace(";", ",", $row->{$field});
    $value = str_replace("\n", ",", $value);
    $value = str_replace("\d", ",", $value);
    $value = str_replace(chr(13), ",", $value);
    $str .= $value.$separator;
  }
  echo $str."\r\n";
}

Могу ли я что-нибудь сделать, чтобы пользователи Mac могли правильно прочитать файл?

Ответы [ 3 ]

1 голос
/ 08 апреля 2010

Для целей отладки:

  1. Создайте файл CSV и отправьте его им по почте. Они могут открыть это хорошо?
  2. Пусть они скачают файл с вашей страницы и отправят вам обратно. Сравните файлы в Hex-редакторе, чтобы исключить вероятность того, что они будут отличаться от того, что вы отправляете в браузер, или от того, что вы сохранили.
  3. Пусть они еще раз проверит свои настройки Excel.
  4. Пусть они создадут рабочий файл CSV с нуля (текстовый редактор на Mac) и обнаружат любые отличия от вашего подхода.
0 голосов
/ 01 сентября 2011

Символ новой строки в Mac - LF (Unicode U + 000A), а в Windows - CR + LF (Unicode U + 000D, после которого U + 000A).

Может быть, поэтому CSV не читается на Mac.

0 голосов
/ 08 апреля 2010

Вот некоторый код, который я сделал для преобразования данных с разделителями табуляции в CSV, и он отлично работает на моем Mac. Обратите внимание, что он настроен так, чтобы я нажимал на скачивание, а не загружал его в браузер. Это не очень хорошее решение (я почти уверен, что код дерьмовый), но оно работает для того, для чего оно мне нужно.

$input = $_POST['input'];
//Remove commas.
$replacedinput1 = str_replace(",", "-", $input);
//remove tabs, replace with commas
$replacedinput2 = str_replace(" ", ",", $replacedinput1);
//create an array
$explodedinput = explode("
", $replacedinput2);
//open the CSV file to write to; delete other text in it
$opencsvfile = fopen("/var/www/main/tools/replace_tab.csv","w+");
//for each line in the array, write it to the file
foreach($explodedinput as $line) {
fputcsv ($opencsvfile, split(',', $line));
};
//close the file
fclose($opencsvfile);
//have the user download the file.
/*
header('Pragma: public');
header('Expires: Fri, 01 Jan 2010 00:00:00 GMT');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Content-Type: application/csv');
header('Content-Disposition: filename=replace_tab.csv'); */

//Or not, since I can't get it to work.
echo "<a href='replace_tab.csv'>Download CSV File, then open in Numbers or Excel (Note, you may need to right click, save as.)</a>.";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...