web-dev-qa-db-ja.com

Mysql LOAD DATA INFILE 100,000 csvレコードは完全ですが、300,000レコード-0行が挿入されました

次のクエリは100,000を完全にインポートしますが、より大きなファイルは何も起こりません。エラーはなく、行はロードされていません。

あなたが提供できるどんな手がかりもありがたいです。最大のファイルとメモリの制限を調査するのに何時間も費やしましたが、助けが必要です。ありがとう!

LOAD DATA LOCAL INFILE 'C:\\temp\\masterplay\\bigone.csv'
INTO TABLE mytable
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(`MARK`,`SERIAL NUMBER`, ...thirty some columns...)

0 rows inserted. (Query took 2.2385 sec)

上記は完全に実行され、100,000レコードではFAST、350,000レコードでは何も実行されません。 CSVが100,000以上のレコードに分解されると、インポートが機能します。

CSVファイルのサイズの例は、314,946レコードです。 1行あたり平均551文字。最大行長は575です。バージョン:MYSQL 5.6.17、PHP 5.5.12 WAMPSERVER 2.5、Windows 10 Pro 16 GB RAM。失敗モードを判別できないため、ファイルのカットオフへの参照がありません。

以下の提案に従って、他のバージョンとLinuxで同じSQLを試しましたが、同じ問題がありました。

更新:

以下のアイデアでは、ソースCSVファイルに焦点を当てました。これまでのところ、CSVを再保存すると(CSV化されたアプリケーションを使用して適切にチェックされ、名前と内容が同じように見えます)、ファイルがインポートされるように何らかの方法で修正されます。何百もの大きなファイルを処理する必要がありますが、違いが何なのかわかりません。

ファイルはテキスト区切り文字なしでコンマで区切られています。ファイルを再度保存した後も、コンテンツは同じであるように見えますが、ファイルサイズは約300K大きくなっています。 CSVファイルタイプには、違いをもたらすヘッダーまたはメタデータがありますか?

5
STWilson

16進エディタでチェックしたファイルと回答が明らかになりました。

私のCSVは、行が次のいずれかで終了するという点で異なりました:

16進0Dキャリッジリターン(\ r)、または

16進0Dキャリッジリターン(\ r)および0Aラインフィード(\ n)

これはコード行です:

LINES TERMINATED BY '\r\n'

または

LINES TERMINATED BY '\r'

私の場合、\nがそれを処理しました-CSVは完全にインポートされます。

この行がCSVと一致しない場合、サイレント処理が行われます。 SQLインポートはエラーなしで実行されますが、行はインポートされません。

2
STWilson