2017-12-13 1 views
0

.csvファイルからmy dbにデータをロードしようとしています。問題は、 "maxSpieler"の数が文字列として保存されていますが、intとして保存したいと思います。私はちょうど何かの種類のスクリプトを使って.csvファイルの値を変更することができますが、私はSQLでこれにアプローチしたいと思います。ここで私はこれまで試したものです、 "問題は" 行で "SET maxSpieler =" ロード・データクエリのスイッチケースを使用してSQLの.csvから値を変更する方法

私のアプローチを開始します:

LOAD DATA LOCAL INFILE 'C:\\Users\\schmidmath\\Documents\\s.csv' 
INTO TABLE spiele 
FIELDS TERMINATED BY ';' 
ignore 1 rows 
(ID_Spiel, name,dauer,@var,@datum,hersteller_id) 
SET maxSpieler = 
    CASE 
     WHEN @var = "Eins" THEN maxSpieler = 1 
     WHEN @var = "Zwei" THEN maxSpieler = 2 
     WHEN @var = "Drei" THEN maxSpieler = 3 
     WHEN @var = "Vier" THEN maxSpieler = 4 
     WHEN @var = "Fünf" THEN maxSpieler = 5 
     WHEN @var = "Sechs" THEN maxSpieler = 6 
    END 
WHERE maxSpieler IN ('Eins', 'Zwei', 'Drei', 'Vier', 'Fünf', 'Sechs') 
SET erscheinungsdatum = STR_TO_DATE(@datum,'%d.%m.%Y') 

の.csvファイル:

ID;Name;Dauer in Minuten;Anzahl Spieler;Erscheinungsdatum;Hersteller_ID 
1;Reversi;30;Fünf;01.12.1893;3 
2;Vier gewinnt;10;Zwei;31.07.1974;1 
3;HeroQuest ;90;Fünf;01.05.1989;1 
4;Das verrueckte Labyrinth;30;Vier;31.12.1986; 
5;Dominion ;40;Vier;01.01.2008; 
6;Mensch ärgere dich nicht;30;Vier;01.01.1910;4 
7;;20;Sechs;08.06.1995;5 
8;Spiel des Lebens;60;Sechs;01.01.1980;1 
9;;10;Zwei;31.12.1970;2 
10;King Arthur;60;Vier;31.10.2003;3 

私のテーブル構造: enter image description here

それをSUMMするには: は私がする必要があります文字列である私の.csvファイルのmaxSpielerの値をintに変更し、それをデータベースに保存します。

+0

あなたは*、テーブルを更新するとき*ケースでTEMPTABLEを更新し、varchar型として一時テーブルに格納できますがSpieler =ケースを設定します。実際のテーブル値(blabla、spieler、blabla)に選択してください。blabla cast(spieler as int)をテンポラリテーブルから選択してください。 – MiloBellano

+0

アイデアありがとうございます。 –

答えて

0

@MiloBellano: もう一度あなたの答えをありがとう。 some1が同じ問題を抱えている場合、ここではインポートのための完全なスクリプトです。 blablablaが...そして、あなたの実際のテーブルに一時テーブルから挿入するとき

DROP table IF exists temp; 
create table temp (id int(11) AUTO_INCREMENT PRIMARY KEY,spieler varchar(30)); 
LOAD DATA LOCAL INFILE 'C:\\Users\\schmidmath\\Documents\\s.csv' 
INTO TABLE temp 
CHARACTER SET latin1 
FIELDS TERMINATED BY ';' 
ignore 1 rows 
(id, @dummy,@dummy1,spieler,@dummy2,@dummy3); 

delete from spiele; 
LOAD DATA LOCAL INFILE 'C:\\Users\\schmidmath\\Documents\\s.csv' 
INTO TABLE spiele 
CHARACTER SET latin1 
FIELDS TERMINATED BY ';' 
ignore 1 rows 
(ID_Spiel, name,dauer,@dummy,@datum,hersteller_id) 
SET erscheinungsdatum = STR_TO_DATE(@datum,'%d.%m.%Y'), 
maxSpieler = 0; 

DROP procedure IF exists test; 

DELIMITER $$ 
CREATE DEFINER='root'@'localhost' PROCEDURE test() 
BEGIN 
DECLARE val1 int(11); 
DECLARE val2 varchar(30); 
DECLARE done INT DEFAULT FALSE; 
DECLARE maxCursor CURSOR FOR SELECT id, spieler FROM ictcampus.temp; 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

OPEN maxCursor; 

read_loop: LOOP 
    FETCH maxCursor INTO val1, val2; 
    IF done THEN 
     LEAVE read_loop; 
    END IF; 
     UPDATE spiele SET maxSpieler= 
      CASE 
       WHEN val2 = "Eins" THEN 1 
       WHEN val2 = "Zwei" THEN 2 
       WHEN val2 = "Drei" THEN 3 
       WHEN val2 = "Vier" THEN 4 
       WHEN val2 = "Fünf" THEN 5 
       WHEN val2 = "Sechs" THEN 6 
       ELSE 0 
      END 
     WHERE ID_Spiel = val1; 
    END LOOP; 
    CLOSE maxCursor; 
END$$ 
DELIMITER ; 


CALL test; 
drop table temp; 
select * from spiele; 
関連する問題