1

次のような米国国勢調査の CSV ファイルがあります。

"ZIP5","ZIP4","ZIP9","STATE CODE","STATE","COUNTY CODE","COUNTY NAME","CBSA CODE","CBSA  TITLE","CBSA LSAD","METRO DIVISION CODE","METRO DIVISION TITLE","METRO DIVISION LSAD","CSA   CODE","CSA TITLE","CSA LSAD"
"04841",,"04841","23","ME","013","Knox County","40500","Rockland, ME","Micropolitan Statistical Area",,,,,,
"04843",,"04843","23","ME","013","Knox County","40500","Rockland, ME","Micropolitan     Statistical Area",,,,,,
"04846",,"04846","23","ME","013","Knox County","40500","Rockland, ME","Micropolitan Statistical Area",,,,,,
"04847",,"04847","23","ME","013","Knox County","40500","Rockland, ME","Micropolitan Statistical Area",,,,,,
"04848",,"04848","23","ME","027","Waldo County",,,,,,,,,
"04849",,"04849","23","ME","027","Waldo County",,,,,,,,,
"04850",,"04850","23","ME","027","Waldo County",,,,,,,,,
"04851",,"04851","23","ME","013","Knox County","40500","Rockland, ME","Micropolitan Statistical Area",,,,,,
"04852",,"04852","23","ME","015","Lincoln County",,,,,,,,,

ファイルには 200 万件を超えるレコードがあります。ほとんどのレコードでは、すべてのフィールドにデータがありません。

上記の CSV ファイルに対して定義した MySQL レコード レイアウトは次のとおりです。

+----------------------+------------------+------+-----+---------+----------------+
| Field                | Type             | Null | Key | Default | Extra          |
+----------------------+------------------+------+-----+---------+----------------+
| id                   | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| ZIP5                 | varchar(5)       | NO   |     | NULL    |                |
| ZIP4                 | varchar(5)       | NO   |     | NULL    |                |
| ZIP9                 | varchar(10)      | NO   |     | NULL    |                |
| STATE_CODE           | varchar(2)       | NO   |     | NULL    |                |
| STATE                | varchar(2)       | NO   |     | NULL    |                |
| COUNTY_CODE          | varchar(3)       | NO   |     | NULL    |                |
| COUNTY_NAME          | varchar(50)      | NO   |     | NULL    |                |
| CBSA_CODE            | varchar(5)       | NO   |     | NULL    |                |
| CBSA_TITLE           | varchar(50)      | NO   |     | NULL    |                |
| CBSA_LSAD            | varchar(50)      | NO   |     | NULL    |                |
| METRO_DIVISION_CODE  | varchar(5)       | NO   |     | NULL    |                |
| METRO_DIVISION_TITLE | varchar(50)      | NO   |     | NULL    |                |
| METRO_DIVISION_LSAD  | varchar(50)      | NO   |     | NULL    |                |
| CSA_CODE             | varchar(3)       | NO   |     | NULL    |                |
| CSA_TITLE            | varchar(50)      | NO   |     | NULL    |                |
| CSA_LSAD             | varchar(50)      | NO   |     | NULL    |                |
+----------------------+------------------+------+-----+---------+----------------+

(ZIP5 を主キーとして定義する必要があることに気付きましたか?)

CSV ファイルに空のフィールドがある場合は、\N に変更する必要があると読みましたが、これを簡単に行う方法はありますか? これを行う PHP プログラムを作成することもできますが、200 万件を超えるレコードでは非常に長い時間がかかり、私のサーバーには十分な RAM がありません。

この CSV ファイルを MySQL に最も簡単にインポートするにはどうすればよいですか? これを行うMySQLのLOADコマンドにいくつかのパラメータがありますか? 現在の動作方法では、ZIP5 にはデータの切り捨てがあり、MySQL を見ると、郵便番号に引用符があり、最初の 4 桁しかないと不平を言っています。ありがとう!

4

2 に答える 2

1

まず、上に投稿したテーブルに主キーがありません。First には常に主キーが必要です。通常、AUTOINCREMENT で id という列を追加します。郵便番号などについては、2 ~ 3 列の複雑なキーを記述するのも便利です。いつものように、状況によって異なります。

輸入に関しては。いくつかの解決策があります

  1. スクリプトをローカルで実行して SQL 挿入ステートメントを生成し、使用可能な任意のインターフェイスを介してデータを mysql サーバーにフィードします。

  2. CSV ファイルをサーバーにアップロードし、コマンド ライン mysql を使用して CSV をインポートします。MySQL には CSV インポーターが組み込まれていますが、私は気に入りませんでした ;)

  3. サーバーでスクリプトを実行し、一度に行を追加します。PHP では、CSV を 1 行ずつロードし、各行で INSERT を実行できます (set_time_limit と memory_limit に応じて覚えておいてください)。ステップ 3 について、コマンド ラインではなくブラウザーを介して実行すると、ブラウザーがタイムアウトする可能性が高いことを思い出してください。スクリプトが終了するまで実行が停止することはありませんのでご安心ください。

私はCSVインポーターを持っていると思います(ジオタグのような巨大なCSVファイル用)。必要な場合はお知らせください。見つけてここに投稿できるかもしれません。

残念ながら、csv インポーターが見つかりませんでした。しかし、fgetcsv の php マニュアルの最初のエントリを見て、いくつかの変更を加えて...

set_time_limit(3600); // 1 hour max script execution time. Adjust it according to your expectations.
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    // this will automate things but modify the csv head for each column to represent the actual column name in your table.
    $header = fgetcsv($handle, 1000, ",");
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $i = 0;
        $values = array();
        foreach($header as $key) {
            if (!empty($data[$i])) {
               $values[$key] = $data[$i];
           }
        }

        $keys = "`" . implode("`, `", array_keys($values)) . "`";
        $values = "'" . implode("', '", $values) . "'";
        $statement = "INSERT INTO `table_name` ({$keys}) VALUES ({$values})";
        // run the statement. the above is if you don't use PDO. For PDO transform accordingly. $values holds the column_name => value pairs. The values that can be null and should not be inserted you should give them default values in your mysql schema (table)
    }
    fclose($handle);
}

これが役立つことを願っています。テストしていませんが、問題ないようです;)

于 2012-10-13T11:33:21.857 に答える
0

ファイル パスを変更し、必要に応じて行末を変更した後、以下の LOAD コマンドを試してください。

LOAD DATA INFILE 'your_file.csv' IGNORE
INTO TABLE zipcodes
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 1 LINES
(ZIP5, ZIP4, ZIP9, STATE_CODE, STATE, COUNTY_CODE, COUNTY_NAME, CBSA_CODE, 
CBSA_TITLE, CBSA_LSAD, METRO_DIVISION_CODE, METRO_DIVISION_TITLE, 
METRO_DIVISION_LSAD, CSA_CODE, CSA_TITLE, CSA_LSAD);
于 2012-10-13T14:28:55.570 に答える