2010-01-26 12 views
48

Mam plik CSV z 11 kolumnami i mam tabelę MySQL z 9 kolumnami.Jak pominąć kolumny w pliku CSV podczas importowania do tabeli MySQL za pomocą LOAD DATA INFILE?

Plik CSV wygląda następująco:

col1, col2, col3, col4, col5, col6, col7, col8, col9, col10, col11 

i tabela MySQL wygląda następująco:

col1, col2, col3, col4, col5, col6, col7, col8, col9 

muszę mapować kolumn 1-8 z pliku CSV bezpośrednio do pierwszych 8 kolumn tabela MySQL. Następnie należy pominąć następne dwie kolumny w pliku CSV, a następnie zmapować kolumnę 11 pliku CSV do kolumny 9 tabeli MySQL.

Obecnie używam następującą komendę SQL:

LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE my_table 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '' 
LINES TERMINATED BY '\n' 

Ale powyższy kod mapy pierwsze 9 kolumny pliku CSV do 9 kolumn w tabeli MySQL.

+0

To może pomóc: http://stackoverflow.com/questions/22988337/csv-file- skip-column-in-import-db/22988896 # 22988896 –

Odpowiedz

70

From Mysql docs:

Można też odrzucić wartość wejściową przez przypisaniem go do zmiennej użytkownika i nie przypisując zmiennej tabeli kolumny:

LOAD DATA INFILE 'file.txt' 
INTO TABLE t1 (column1, @dummy, column2, @dummy, column3); 
+9

FYI: Musiałem dodać wyrażenie pola "(column1, @dummy, column2 ..." na końcu mojego przykładu SQL. Początkowo dodałem go bezpośrednio po nazwa tabeli, jak pokazano powyższy przykład, ale ciągle otrzymuję błąd MySQL. – Camsoft

+0

może ktoś mi powiedzieć, jak mogę zignorować @dummy – deemi

+0

You ne ed co najmniej 'POLA ZAKOŃCZONE PRZEZ ','' aby uniknąć "Wiersz 1 nie zawiera danych dla wszystkich kolumn" –

4

Step1. radzić sobie z awk.

cat file.txt |awk '{print $1,$2,$5...}'>new_file.txt 

step2.load do mysql.

load data local infile 'new_file' into table t1(...) 

Poniższa metoda jest prosta, ale niedozwolona w niższej wersji mysql.

LOAD DATA INFILE 'file.txt' 
INTO TABLE t1 (column1, @dummy, column2, @dummy, column3); 
+0

Lubię korzystać z awk tutaj, pokazując piękno łączenia wielu narzędzi razem. – Paul

+0

czy ktoś może mi powiedzieć, jak mogę zignorować @dummy – deemi

0

@deemi:

Jedynym sposobem, aby ignorować @dummy jest ustawienie domyślne Pole do AUTO INCREMENT. Więc można pominąć pole i tylko kod tak,

LOAD DATA INFILE 'file.txt' 
INTO TABLE t1 (column2, column3, column4, column5); 

// zakłada, że ​​nazwa_pola column1 jest ustawiony na AUTO INCREMENT domyślnie.

0

Myślę, że jest jeszcze jedna zmiana w kodzie:

Poniższa komenda SQL:

LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE my_table 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '' 
LINES TERMINATED BY '\n' 

-will prawdopodobnie spowodować błąd obcięcia danych.

Więc lepiej jest używać LINES TERMINATED BY '\r\n' zamiast LINES TERMINATED BY '\n'

więc kod będzie:

LOAD DATA LOCAL INFILE 'filename.csv' INTO TABLE my_table 
FIELDS TERMINATED BY ',' 
ENCLOSED BY '' 
LINES TERMINATED BY '\r\n' 
Powiązane problemy