[gelöst] Variable aus CSV einlesen

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
joe2017
Beiträge: 1125
Registriert: 07.08.2017 14:29:51

[gelöst] Variable aus CSV einlesen

Beitrag von joe2017 » 29.06.2018 10:27:11

Ich weiß hierzu gibt es dutzende Beiträge. Jedoch hab ich eine spezielle Frage und komme hierbei nicht weiter.
Ich möchte variablen aus einer csv Datei einlesen. Prinzipiell ist das kein Problem.

Code: Alles auswählen

#!/bin/bash

IFS=","
while read var1 var2
do
test1=$var1
test2=$var2
done < test.csv
Wie mache ich das ganze wenn ich nicht weiß wie viele Daten in einer Zeile stehen? Ich lese immer nur die erste Zeile ein. Hier können jedoch 1 bis x Daten stehen.
Das kann man doch sicher mit wenig Aufwand realisieren oder?

Bzw. könnten meine Werte bereits in einer Variable anstatt in einer CSV Datei stehen.
Bsp.
VAR=var1 var2 var3 var4 usw.
Zuletzt geändert von joe2017 am 02.07.2018 09:29:18, insgesamt 1-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 3473
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable aus CSV einlesen

Beitrag von heisenberg » 29.06.2018 10:33:57

read kann statt einzelnen Variablen auch alles in ein Array einlesen.

Siehe: man bash
... unterhält sich hier gelegentlich mangels wunschgemäßer Gesprächspartner mal mit sich selbst.

uname
Beiträge: 12045
Registriert: 03.06.2008 09:33:02

Re: Variable aus CSV einlesen

Beitrag von uname » 29.06.2018 10:37:05

Z.B. so:

Code: Alles auswählen

#!/bin/bash
IFS=","
read -a test < test.csv
Variablen im Array und deren Ausgabe:

Code: Alles auswählen

echo ${test[0]}
echo ${test[1]}
echo ${test[2]}
Hierbei entspricht:

Code: Alles auswählen

${test[0]} <-> $var1 <-> $test1
${test[1]} <-> $var2 <-> $test2
...
Der Computer zählt immer ab 0. Solltest du auch machen.
joe2017 hat geschrieben:Bzw. könnten meine Werte bereits in einer Variable anstatt in einer CSV Datei stehen.
Du kannst die Werte auch dem Progamm übergeben.

./test.sh 1 2 3

Code: Alles auswählen

#!/bin/bash
echo $1
echo $2
echo $3
$0 ist hier der Programmaufruf und für dich nicht interessant.

Benutzeravatar
joe2017
Beiträge: 1125
Registriert: 07.08.2017 14:29:51

Re: Variable aus CSV einlesen

Beitrag von joe2017 » 29.06.2018 10:56:02

Dann muss ich aber auch wieder wissen wie viele Werte (0 1 2 3 usw.) ich übergeben muss. Das weiß ich jedoch nicht.

uname
Beiträge: 12045
Registriert: 03.06.2008 09:33:02

Re: Variable aus CSV einlesen

Beitrag von uname » 29.06.2018 11:02:57

https://ryanstutorials.net/bash-scripting-tutorial/bash-variables.php hat geschrieben:$# - How many arguments were passed to the Bash script.

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable aus CSV einlesen

Beitrag von thoerb » 29.06.2018 11:59:52

Wie mache ich das ganze wenn ich nicht weiß wie viele Daten in einer Zeile stehen? Ich lese immer nur die erste Zeile ein. Hier können jedoch 1 bis x Daten stehen.
Ich kenne mich mit Shellscript nicht so gut aus und müsste jetzt selbst erst mal googeln. Aber du musst die erste Zeile einlesen und dann durch die Kommas splitten, dann bekommst du die Anzahl deiner Variablen. (Die Länge des Arrays für die erste Zeile) Und die muss dann ja für alle anderen Zeilen gleich sein.

Edit: Wie du ein Array aus der ersten Zeile einliest wurde dir schon von @uname erklärt. http://openbook.rheinwerk-verlag.de/she ... 731F04A174

Benutzeravatar
Phineas
Beiträge: 348
Registriert: 20.06.2012 20:26:19

Re: Variable aus CSV einlesen

Beitrag von Phineas » 29.06.2018 20:58:19

joe2017 hat geschrieben: ↑ zum Beitrag ↑
29.06.2018 10:56:02
Dann muss ich aber auch wieder wissen wie viele Werte (0 1 2 3 usw.) ich übergeben muss. Das weiß ich jedoch nicht.
Die Bash zählt es für dich, guckst du:

Code: Alles auswählen

echo ${#array[*]}

thoerb
Beiträge: 1677
Registriert: 01.08.2012 15:34:53
Lizenz eigener Beiträge: MIT Lizenz

Re: Variable aus CSV einlesen

Beitrag von thoerb » 29.06.2018 22:13:30

Zusammenfassend:

Code: Alles auswählen

#!/bin/bash

IFS=","
read -a test < test.csv

echo "Anzahl der Spalten:" ${#test[*]}

Benutzeravatar
ThorstenS
Beiträge: 2875
Registriert: 24.04.2004 15:33:31

Re: Variable aus CSV einlesen

Beitrag von ThorstenS » 30.06.2018 09:49:48

In awk gibt es die spezielle Variable Number_of_Fields - kurz NF. So gibst du damit für jede Zeile die Anzahl der Felder aus:

Code: Alles auswählen

awk -F',' '{print NF}' datei.csv

Benutzeravatar
joe2017
Beiträge: 1125
Registriert: 07.08.2017 14:29:51

Re: Variable aus CSV einlesen

Beitrag von joe2017 » 02.07.2018 09:29:02

Ich hab das ganze dann folgendermaßen gelöst:

Meine eingelesenen Variablen stehen in einer Variable (result).

Code: Alles auswählen

for i in ${result[@]}; do

owl102

Re: Variable aus CSV einlesen

Beitrag von owl102 » 02.07.2018 10:15:06

joe2017 hat geschrieben: ↑ zum Beitrag ↑
02.07.2018 09:29:02

Code: Alles auswählen

for i in ${result[@]}; do
Nimm besser

Code: Alles auswählen

for i in "${result[@]}"; do
denn dann funktioniert es auch korrekt, wenn in einem der Werte ein Leerzeichen enthalten ist.

Siehe auch: http://mywiki.wooledge.org/BashGuide/Arrays

Antworten