Как импортировать файл xls / csv с кодировкой Unicode в php / mysql? - PullRequest
3 голосов
/ 22 мая 2009

Я хочу дать пользователю возможность импортировать CSV-файл в мою систему php / mysql, но у меня возникли некоторые проблемы с кодировкой, когда русский язык является лучшим, который можно хранить только в UTF-16 файлах с вкладками.

Сейчас моя база данных находится на латинице 1, но я изменю это на utf-8, как описано в вопросе "a-script-to-change-all-tables-and-fields-to-utf-8-bin" -collation-в-MySQL "

Но как мне импортировать файл? и хранить строки?

Должен ли я, например, перевести его в html_entitites?

Я использую команду fgetcsv, чтобы получить данные из файла CSV. Мой код выглядит примерно так прямо сейчас.


file_put_contents($tmpfile, str_replace("\t", ";", file_get_contents($tmpfile)));
$filehandle = fopen($tmpfile,'r');
while (($data = fgetcsv($filehandle, 1000, ";")) !== FALSE) {
  $values[] = array(
    'id' => $data[0], 
    'type' => $data[1], 
    'text' => $data[4], 
    'desc' => $data[5], 
    'pdf' => $data[7]);
}

Как отмечается, если я сохраняю файл xls в формате csv в excel, я заменяю специальные символы на '_', поэтому единственный способ получить русские символы из файла - это сохранить файл в Excel как отдельный файл с вкладками в формате UTF16.

Ответы [ 5 ]

2 голосов
/ 23 мая 2009

Хорошо, решение было экспортировать файл из Excel в текст Unicode UTF16 и добавить ';' вместо '\ t' и конвертировать из utf16 в utf8.

<pre>file_put_contents($tmpfile, str_replace("\t", ";", iconv('UTF-16', 'UTF-8', file_get_contents($tmpfile))));

Таблица в mysql должна быть изменена с latin1 на utf8

ALTER TABLE  `translation` 
CHANGE  `text`  `text` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
CHANGE  `desc`  `desc` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL

И тогда файл можно импортировать, как и раньше.

Когда я хочу экспортировать данные из базы данных в файл Excel, csv-версия имеет значение , а не . Это должно быть сделано в HTML-режиме Excel. Где данные корректируются, например, urlencode() или htmlentities()

Вот пример кода.


<?php
header('Content-type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="export.xls"');
print ('<html xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:x="urn:schemas-microsoft-com:office:excel"
xmlns="http://www.w3.org/TR/REC-html40">
<div id="Classeur1_16681" align=center x:publishsource="Excel">
<table x:str border=0 cellpadding=0 cellspacing=0 width=100% style="border-collapse: collapse">');
for($i = 0 ; $i < count($lines) ; $i++) {
    print ('<tr><td>');
  print implode("</td><td>",$lines[$i]);
    print ('</td></tr>');
}
?>
</div>
</body>
</html>
0 голосов
/ 26 сентября 2013

Я перепробовал множество альтернатив, но самое простое и быстрое решение - использовать Navicat

http://www.navicat.com/

enter image description here

0 голосов
/ 15 июля 2010

Хорошо, мое решение было ТАКЖЕ , чтобы экспортировать файл из Excel в текст Unicode UTF16. Единственным отличием было то, что я взял свой файл, используя разделитель табуляции:

fgetcsv($fp, '999999', "\t", '"')
0 голосов
/ 22 мая 2009

Я бы не импортировал его с помощью PHP. Вместо этого рассмотрите возможность создания временной таблицы для хранения ваших данных, используя READ DATA INFILE .

$file_handle = fopen($file_name, 'r');
$first_row = fgetcsv($file_handle, 0, ',', '"');
fclose($file_handle);
# Your usual error checking
if (!is_array($first_row)) {
    ...
}
$columns = 'column'.implode(' TEXT, column', array_keys($first_row)).' TEXT';
query("CREATE TABLE $table ($columns) Engine=MyISAM DEFAULT CHARSET=ucs2");
query("LOAD DATA LOCAL INFILE '$file_name' INTO TABLE $table ...

Тогда вы можете делать все, что захотите, с данными в этой таблице.

0 голосов
/ 22 мая 2009

В качестве альтернативы вы можете использовать команду загрузки MySQL . Эта команда позволяет указать разделители, набор символов и т. Д. Единственное предостережение: сервер, загружающий данные, должен иметь прямой видимость файла, то есть файл должен находиться в файловой системе, видимой и читаемой сервером БД.

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