sql >> データベース >  >> RDS >> Mysql

mysqlはcsvまたは他のtxtファイルを1つの列にインポートできますか?

    はい、いくつかの手順で実行できます:

    最初 一時的なステージングテーブルを作成します(importと呼びます) )ソースデータファイルの行として行を保持する1つの列

    CREATE TABLE `import` (
      `line` varchar(512) DEFAULT NULL
    );
    

    ファイルからテーブルにデータをロードします

    LOAD DATA INFILE '/path/to/your/file.txt'
    INTO TABLE import
    FIELDS TERMINATED BY '\n'
    LINES  TERMINATED BY '\n'
    

    2番目 ターゲットテーブルがあると仮定します(wordsと呼びましょう) )これは次のようになります

    CREATE TABLE `words` (
      `word` varchar(64) DEFAULT NULL
    );
    

    各行を単語に分割して、wordsに挿入できます。 クエリを含むテーブル

    INSERT INTO words (word)
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(line, ' ', n.n), ' ', -1) word
      FROM import CROSS JOIN 
    (
       SELECT a.N + b.N * 10 + 1 n
         FROM 
        (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
       ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
        ORDER BY n
    ) n
     WHERE n.n <= 1 + (LENGTH(line) - LENGTH(REPLACE(line, ' ', '')))
     ORDER BY n.n
    

    注:

    • 単語が1つのスペースで正確に区切られていることを前提としています
    • このクエリは最大100語に分割されます。多かれ少なかれ必要な場合は、内部サブクエリを編集して制限を調整できます。または、定期的にインポートする場合は、代わりに永続化された集計(数値)テーブルを使用することを検討してください。

    3番目 ステージングテーブルを削除または切り捨てます(さらにファイルをインポートするために再度使用する場合)

    DROP TABLE import;
    

    これがSQLFiddle です。 ステップ2を示すデモ。




    1. SQL2つの異なるテーブルの2つの列を比較する方法

    2. mysqlの低速クエリログの回転

    3. SQLiteでミリ秒を日付に変換する方法

    4. ネイティブテーブル'performance_schema'。'???'構造が間違っています