0

I'm trying to read a csv file and load the values to a mysql table.

My csv file looks like this:

"1026235","2172","Werdmühlestrasse","4","400","Werdmühlestrasse 4","3","real","BB","261AA01857","3169179","2683137.449","1247708.724","8001","0","Zürich","AA1750","","K","1","Lindenhof","13","1301","Zürichberg","Altstadt","St.Peter u Paul","St.Peter","1026238","562","Fortunagasse","15","1500","Fortunagasse 15","3","real","BB","261AA01852","140709","2683163.645","1247502.811","8001","0","Zürich","AA5297","","K","1","Lindenhof","13","1301","Zürichberg","Altstadt","St.Peter u Paul","St.Peter","1","3","3","29.0","8.539764579706915","47.373115180353350","POINT (2683163.8 1247502.8)"

This is the command I'm trying to run:

    LOAD DATA INFILE '/home/coder/project/geoz.adrstzh_adressen_stzh_p.csv'
INTO TABLE mainZuerichAddresses
FIELDS
    TERMINATED BY ','
    OPTIONALLY ENCLOSED BY '"'
    ESCAPED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS
(@col1,@dummy,@col3,@col4,@dummy,@col6,@col7,@dummy,@dummy,@col10,@dummy,@dummy,@dummy,@col14,@dummy,@col16,@dummy,@dummy,@dummy,@col20,@col21,@dummy,@col23,@col24,@col25,@col26,@col27,@col28,@col29,@dummy,@dummy,@dummy,@dummy,@col34) 
SET objid=@col29,gebaeudeeingangnummer=@col1,adresse=@col6,lokalisationsname=@col3,
    hausnummer=@col4,plz=@col14,plz_ortschaft=@col16,stadtkreis=@col20,
    gebaeudenummer=@col10,statistisches_quartier=@col21,status=@col7,statistische_zone=@col23,schulkreis=@col24,verwaltungsquartier=@col25,
    roem_kath_kirchgemeinde=@col26,ev_ref_kirchgemeinde=@col27,ev_ref_kirchenkreis=@col28,geometry=@col34;
   

Here I added all the 34 columns from the csv file:

(@col1,@dummy,@col3,@col4,@dummy,@col6,@col7,@dummy,@dummy,@col10,@dummy,@dummy,@dummy,@col14,@dummy,@col16,@dummy,@dummy,@dummy,@col20,@col21,@dummy,@col23,@col24,@col25,@col26,@col27,@col28,@col29,@dummy,@dummy,@dummy,@dummy,@col34) 

and here I'm trying to add the data to the table columns I have, which are in a different order than the csv and I don't need all of them, only 18. (Can I even do that, cherry-pick columns from the csv file and mix their order?)

SET objid=@col29,gebaeudeeingangnummer=@col1,adresse=@col6,lokalisationsname=@col3,hausnummer=@col4,plz=@col14,plz_ortschaft=@col16,stadtkreis=@col20,gebaeudenummer=@col10,statistisches_quartier=@col21,status=@col7,statistische_zone=@col23,schulkreis=@col24,verwaltungsquartier=@col25,roem_kath_kirchgemeinde=@col26,ev_ref_kirchgemeinde=@col27,ev_ref_kirchenkreis=@col28,geometry=@col34;

But I'm keep getting this error:

ERROR 1366 (HY000): Incorrect integer value: 'Werdmühlestrasse 4' for column 'plz' at row 1

I read the documentation, but it's not very clear how the mysql should be formatted.:

You must also specify a column list if the order of the fields in the input file differs from the order of the columns in the table. Otherwise, MySQL cannot tell how to match input fields with table columns.

I based my mysql command on this question, but it's quite old.

I also found this question which gave some advice about FIELDS and LINES termination so I played around a bit with that.

I'm not sure if the csv formatting is the problem or the order I'm trying to load the data from the csv into the table colums.

Someone has an idea?

  • You have an extra `;` after `IGNORE 1 ROWS`. Is that in the real query or a copying error? – Barmar Jun 24 '22 at 18:45
  • Yes, thanks, I just noticed that. If I delete it, I get a different, 'ERROR 1262 (01000): Row 1 was truncated; it contained more data than there were input columns' error. –  Jun 24 '22 at 18:52
  • How about you create a duplicate of `mainZuerichAddresses` table and make all the column uses `VARCHAR` (or `TEXT`?) datatype . Then do the `LOAD DATA INFILE` on that duplicate table and see if there's any error. If it run successfully, check the data inserted in that table and see which part is incorrect. Fix the incorrect part on the `LOAD DATA INFILE` code, truncate the duplicate table then do the operation again. Repeat until you've fix everything. – FanoFN Jun 25 '22 at 01:33
  • 1
    Please add the table definition as text and a few more rows from the csv file. – P.Salmon Jun 25 '22 at 06:51
  • Please ask 1 (specific researched non-duplicate) question. Put everything needed to ask your question in your post, including credited quotes from elsewhere that you relate to your question. Don't have anything only at a link & don't expect us to read a link & figure out what is relevant & why. Give a cut & paste & runnable [mre]. (Note the "minimal".) [ask] [Help] PS Clarify via edits, not comments. Please delete & flag obsolete comments. – philipxy Jun 26 '22 at 13:45

2 Answers2

1

look carefully on error message. There says value: 'Werdmühlestrasse 4' is not integer.

  • 1
    Yes, that's the problem, 'Werdmühlestrasse 4' should go to the 'addresse' column, not 'plz' column. In the csv, 'addresse' is column5, in the table I would like it to be column3. –  Jun 24 '22 at 18:54
  • Every thins looks fine... Show the csv file. – Viktor Melnikov Jun 24 '22 at 21:25
0

There are a number of questions in your question for this part 'it's not very clear how the mysql should be formatted'

What appears in brackets defines the order of columns in the csv file and should include all columns for example

given a csv file

name,junk,val
mike,1234,aaa
bob,4567,bbb
steve,8910,ccc

and a table

create table t(id int auto_increment primary key, 
name varchar(20),
junk varchar(20),
val varchar(20));

The following will fail because I have not provided a column list in the csv file and load data infile attempts to load the first field in input file to id and the datatype does not match the datatype for id in the table.

LOAD DATA INFILE 'C:\\Program Files\\MariaDB 10.1\\data\\sandbox\\data.txt'
INTO TABLE t
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'  ESCAPED BY '"'
LINES TERMINATED BY '\r\n' IGNORE 1 ROWS;

in fact I want to allow auto increment so I specify the target columns for all the input file columns.

LOAD DATA INFILE 'C:\\Program Files\\MariaDB 10.1\\data\\sandbox\\data.txt'
INTO TABLE t
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'  ESCAPED BY '"'
LINES TERMINATED BY '\r\n' IGNORE 1 ROWS
(name,junk,val);

+----+-------+------+------+
| id | name  | junk | val  |
+----+-------+------+------+
|  1 | mike  | 1234 | aaa  |
|  2 | bob   | 4567 | bbb  |
|  3 | steve | 8910 | ccc  |
+----+-------+------+------+
3 rows in set (0.001 sec)

and if I want col3 in the file for go to name in table and col1 in file to go to val in table

LOAD DATA INFILE 'C:\\Program Files\\MariaDB 10.1\\data\\sandbox\\data.txt'
INTO TABLE t
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'  ESCAPED BY '"'
LINES TERMINATED BY '\r\n' IGNORE 1 ROWS
(val,junk,name);

+----+-------+------+-------+
| id | name  | junk | val   |
+----+-------+------+-------+
|  1 | mike  | 1234 | aaa   |
|  2 | bob   | 4567 | bbb   |
|  3 | steve | 8910 | ccc   |
|  4 | aaa   | 1234 | mike  |
|  5 | bbb   | 4567 | bob   |
|  6 | ccc   | 8910 | steve |
+----+-------+------+-------+
6 rows in set (0.001 sec)

and if I want to load a column from the input file park it in a user defined variable and do nothing with it (as you have done)

LOAD DATA INFILE 'C:\\Program Files\\MariaDB 10.1\\data\\sandbox\\data.txt'
INTO TABLE t
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'  ESCAPED BY '"'
LINES TERMINATED BY '\r\n' IGNORE 1 ROWS
(val,@dummy,name);

+----+-------+------+-------+
| id | name  | junk | val   |
+----+-------+------+-------+
|  1 | mike  | 1234 | aaa   |
|  2 | bob   | 4567 | bbb   |
|  3 | steve | 8910 | ccc   |
|  4 | aaa   | 1234 | mike  |
|  5 | bbb   | 4567 | bob   |
|  6 | ccc   | 8910 | steve |
|  7 | aaa   | NULL | mike  |
|  8 | bbb   | NULL | bob   |
|  9 | ccc   | NULL | steve |
+----+-------+------+-------+
9 rows in set (0.001 sec)

Another use for the user defined variables is for input processing see the manual for examples of this https://dev.mysql.com/doc/refman/8.0/en/load-data.html

in your case you aren't doing any input transformations so all those set statements appear to be unnecessary, but will work.

P.Salmon
  • 17,104
  • 2
  • 12
  • 19