2016-09-07 17 views
1

私はかなりの時間を過ごしましたが、これは私が探しているものの正しい方向に向いているとは思えません。私の.csvファイルの問題は、ラインターミネータは ',,,,'ですが、いくつかの行にはこれが含まれていないので、ファイルをインポートすると、これらのファイルのいずれかに到達するまでは正常ですが、それを処理します標準レコードが持つべき列の長さの約2倍の1つのレコードとして、それからその時点からスローされます。私がする必要があるのは、正しい数の列(15)を超えるレコード( ',,,,'終端間のデータ)をスキップすることです。私はこれが本質的に2つのレコードをスキップすることに気づくでしょう。しかし、それはかなり大きなデータセットでやっていることを目的としています。MySQLロードデータInFile;スキップ行IF

私はIGNOREキーワードを見つけましたが、それは当てはまりません。私が探しているものは、次のようなものです。インポート中の各レコードについては、record.columns.count> 15の場合はレコードをスキップします。ここにインポート・ステートメントがあります。

LOAD DATA LOCAL INFILE "/Users/foo/Desktop/csvData.csv" 
INTO TABLE csvData 
COLUMNS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
ESCAPED BY '"' 
LINES TERMINATED BY ',,,,'; 
+0

@Bill Karwinこのタグを付けてくれてありがとう。 –

答えて

0

あなただけの不正な形式のレコードをスキップしたい場合は、唯一の良いレコードをフィルタリングするための簡単なawkコマンドは次のとおりです。固定ファイルから次に

awk -F, '{ if (NF == 15) print; }' csvData.csv > csvData_fixed.csv 

LOAD DATA

好きな人には、awk(またはPythonなど)を使ってスクリプトを書いて、不正な形式のレコードを適切な形式で書き直すことができます。


コメント:awkコマンドは元のファイルを読み込み、フィールドがコンマで区切られた正確に15個のフィールドを持つ各行のみを出力します。

あなたの入力データには、それが記述されているにもかかわらず、正確に15個のフィールドを持つ行はありません。


もう一つの考え:それはあなたの元LOAD DATAコマンドの「,,,,」の行ターミネータを使用するように少し奇妙です。通常、行終端文字は改行文字である '\ n'です。だから、行終止符を ',,,,'として再定義すると、MySQLは複数の行のテキストにわたって数十のフィールドを読んでも、 ',,,,'が見つかるまでテキストを読み続けることになります。おそらく、ラインターミネータを ',,,, \ n'に設定することができます。

+0

何らかの理由で、csvData_fixed.csvファイルが作成されましたが、空です。私はawkのコマンドに精通していないが、私はあなたが何をやっているのか理解できるかどうかを調べ始めたばかりだ。あなたは、インポートする前にファイルを修正するという解決策はうまくいくでしょう、私はここでどのようにトラブルシューティングするか分かりません。ありがとう –

+0

あなたの助けていただきありがとうございます、私はそれを '\ n'を行終止符として使用し、 ',,,,'を含めずに作業しています。あまりにも単純な...そして、あなたは正しかった、NF == 15という条件は決してありませんでした。なぜなら、フィールドのいくつかに "foo、bar"のような文字列が含まれていたからです。真ん中のコンマは、1つの文字列であったはずだが、キャプチャされていた。もう一度おねがいします。私は毎日新しいことを学びます! –

+0

引用符付きの文字列の中に埋め込まれたカンマは、CSV解析関数を使用していれば処理できましたが、スクリプト言語で適切な関数が存在するはずです。とにかく、ラインターミネーターとして改行を使用することを提案してうれしいです! –

関連する問題