CSV in SQL import mehrer Dateien

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
gnude
Beiträge: 1569
Registriert: 14.09.2009 22:05:28
Kontaktdaten:

CSV in SQL import mehrer Dateien

Beitrag von gnude » 17.10.2019 12:26:44

Hallo
ich möchte gern mehrere Dateie in einem Rutsch in eine MySQL Datenbank importieren.
Die Spalten die importiert werden möchte ich natürlich bestimmen können.
Folgendes Script habe ich gefunden:

Code: Alles auswählen

#!/bin/bash
IFS=,
while read column1 column2 column3
      do
        echo "INSERT INTO cost (column1,column2,column3) VALUES ('$column1', '$column2', '$column3');"

done < input.csv | mysql -u myusername -p mypassword mydata;
mv input.csv /bearbeitet
Hiermit werden die Daten aus der Datei übernommen. Wenn ich nun eine Schleife haben möchte, die alle CSV Dateien eines Verzeichnisses importiert und dann verschiebt, wie würde das mit der Shell aussiehen?

Benutzeravatar
noobadix
Beiträge: 53
Registriert: 03.02.2009 03:23:22

Re: CSV in SQL import mehrer Dateien

Beitrag von noobadix » 19.10.2019 07:56:10

Hi!

Das folgende Script ist nicht sehr solide, aber bildet erstmal eine bessere Grundlage als das von dir gepostete, denke ich. Es iteriert über alle .csv-Dateien eines Verzeichnisses, das als Argument übergeben wird, und überträgt die Daten in eine Datenbank, wenn man die entsprechenden Stellen im Code anpasst (user name, Passwort, DB-, Spalten- und Tabellenname)

Hilft dir das schon?

Code: Alles auswählen

#!/bin/bash
#backup ifs
BACKUPIFS=$IFS
#Test if exactly one valid path was passed as argument and if we can read write and execute
if [ $# -ne 1 ] || [ ! -d $1 ] || [ ! -w $1 ] || [ ! -r $1 ] || [ ! -x $1 ]
then
	echo "ERROR: Pleas pass exactly one valid path as argument"
	echo "EXIT"
	exit 1
fi

PATH_TO_PROCESSED="$1/processed"

#create folder 'processed'
if [ ! -d $PATH_TO_PROCESSED ]
then
	if ! mkdir $PATH_TO_PROCESSED
	then
		echo "ERROR: cannot create path $PATH_TO_PROCESSED"
		echo "EXIT"
		exit 1
	fi
fi	

tablename="REPLACE_WITH_TABLE_NAME"
column_name1="REPLACE_WITH_COLUMN_NAME1"
column_name2="REPLCE_WITH_COLUMN_NAME2"

#find csv files in that path
for file in `find $1 -maxdepth 1 -type f -name "*.csv"`
do	
	echo ""
	echo "Processing file: $file..."

	#if we can read and write
	if [ -w $file ] && [ -r $file ]
	then
	
		PREVIFS=$IFS
		IFS=,
		while read col1 col2
		do
			echo "insert into $tablename ($column_name1, $column_name2) values (\"$col1\", \"$col2\");"
		done < $file |`mysql --user=REPLACE_WITH_USER --password=REPLACE_WITH_PASSWORD REPLACE_WITH_DB_NAME`
		IFS=$PREVIFS
		
		mv $file $PATH_TO_PROCESSED
	else
		echo ""
		echo "### ERROR ### Cannot read or write file $file"
		echo ""
	fi
done
IFS=$BACKUPIFS
Know your tools, train your basics.

Antworten