2009-05-21 8 views
3

私はcsvファイルをphp/mysqlシステムにインポートする機能を提供したいのですが、UTF-16タブでコード化されたタブファイルでしか保存できないロシア語の言語ではエンコーディングに関する問題が発生しました。ユニコードのcharsetを持つxls/csvファイルをphp/mysqlにインポートするには?

私のデータベースはlatin1ですが、質問に記載されているようにutf-8に変更します。 "a-script-to-change-all-tables-and-fields-to-the-utf-8- bin-collat​​ion-in-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]); 
} 
 

私はExcelでCSVとしてXLSファイルを保存する場合は、私の特別な文字は「_」に置き換えられているので、私は、ファイルのうち、ロシア文字を得ることができる唯一の方法は、格納することですファイルをUTF16形式のタブ付き分離ファイルとしてExcelに保存します。

答えて

2

さて、解決策はファイルをExcelからUTF16ユニコードテキストにエクスポートし、 ';'を追加することでした。 utf16からutf8に変換します。

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

The table in mysql has to be changed from latin1 to 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

And then the file could be imported as before.

When I want to export the data from the database to a excel file, the csv-version is not an option. It has to be done in excel's html mode. Where data is corrected by eg. 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

また、load commandを使用することもできます。このコマンドでは、区切り文字や文字セットなどを指定できます。データをロードするサーバーはファイルを直接参照できる必要があります。つまり、ファイルはdbサーバーによって表示および読み取り可能なファイルシステムに存在する必要があります。

+0

を使用することです。唯一の違いは、私はタブ区切り文字を使用して、私のファイルをつかむことでしたloadコマンドはutf16をサポートしていません ドキュメント: "現在、ucs2、utf16、またはutf32文字セットを使用するデータファイルをロードすることはできません。 " –

+0

私はドキュメントのその部分を見逃しました、ごめんなさい。 :( MySQLのようなサウンドは一般的にutf16に問題があるので、あなたのコードでutf16からutf8に変換する必要があるかもしれません。すでに質問されているように、SO(http:// stackoverflow。mb_convert_encoding関数は、http:// www。com/questions/155514/how-to-convert-a-utf-8-string-to-a-utf-16-string-in-php) php.net/manual/en/function.mb-convert-encoding.php) – toluju

+0

私はあなたに関連するトピックでこの質問を見てもらえますか?http://stackoverflow.com/questions/11116963/bangla-language- unicoded-in-unicoded-csv-file –

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 ... 

次に、そのテーブルのデータを使用して任意の操作を実行できます。

+0

サポートされていない文字セットの注釈について:私は実際に試してみると、データをロードしている間は変換ができないということです。これは簡単なコピー操作ではたらくはずのカラムにバイトの束をダンプするはずです – soulmerge

+0

私はあなたに関連トピックでこの質問を見るように頼むかもしれませんhttp://stackoverflow.com/questions/11116963/bangla-language- unicoded-csv-fileには表示されませんか? –

0

さて、私の解決策は、UnicodeテキストをUTF16するために、Excelからファイルをエクスポートすることもました。

fgetcsv($fp, '999999', "\t", '"') 
0

私は代替の多くを試みたが、最も簡単かつ迅速なソリューションがNavicatは

http://www.navicat.com/ 

enter image description here

関連する問題