我想让用户能够将csv文件导入到我的php / mysql系统中,但是当语言是俄语时,遇到了一些编码问题,而excel只能存储在UTF-16标签编码标签文件中。
现在我的数据库在latin1中,但我会将其更改为utf-8,如问题“a-script-to-change-all-tables-and-fields-to-the-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格式。
答案 0 :(得分:2)
好的,解决方案是将文件从excel导出为UTF16 unicode文本并添加';' '\ t'的instaid并从utf16转换为utf8。
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-version是不是的选项。它必须在excel的html模式下完成。数据通过例如更正的地方。 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>
答案 1 :(得分:0)
或者你可以使用MySQL load command。此命令允许您指定分隔符,字符集等。需要注意的是,加载数据的服务器必须具有文件的直接可见性,这意味着该文件必须驻留在数据库服务器可见和可读的文件系统上。
答案 2 :(得分:0)
我不会使用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 ...
然后,您可以使用该表中的数据执行任何操作。
答案 3 :(得分:0)
好的,我的解决方案 ALSO 将文件从excel导出为UTF16 unicode文本。唯一的区别是我使用制表符分隔符获取文件:
fgetcsv($fp, '999999', "\t", '"')
答案 4 :(得分:0)
我尝试了很多替代方案,但最简单快速的解决方案是使用 Navicat
http://www.navicat.com/