Import CSV value into Bash

10,276

Basic building block to solve your problem:

#!/bin/bash

while IFS="," read Alabama  Alaska  Arizona Arkansas  California  Colorado  Connecticut Delaware Florida  Georgia  Hawaii  Idaho  Illinois  Indiana  Iowa 
do
    echo $Alabama
done < my_file.csv

Given your input file, this produces:

sh$ ./m.sh 
Alabama
1000
100
10001

EDIT If you are only interested in the n-th line (stored in CSV_LINE), you could sed -n ...p your input file (and use if instead of while):

#!/bin/bash

# ...
# Set your CSV_LINE to the (file) line number you are looking for (here, line 2)
CSV_LINE=2
# ...

sed -n "${CSV_LINE}p" | if IFS="," read Alabama  Alaska  Arizona Arkansas  California  Colorado  Connecticut Delaware Florida  Georgia  Hawaii  Idaho  Illinois  Indiana  Iowa 
then
    echo $Alabama
fi < my_file.csv

Please note: since pipes are executed in a sub shell, the various variables are only bound inside the body of the if statement.


If you don't like the if construct, I've just learned than using process substitution you might write:

#!/bin/bash

# ...
# Set your CSV_LINE to the (file) line number you are looking for (here, line 2)
CSV_LINE=2
# ...

IFS="," read Alabama  Alaska  Arizona Arkansas  California  Colorado  Connecticut Delaware Florida  Georgia  Hawaii  Idaho  Illinois  Indiana  Iowa \
       < <(sed -n "${CSV_LINE}p" < my_file.csv)

echo $Alabama

Without a pipe there is not sub-shell -- so the variable are accessible from anywhere in the script after issuing the read internal command.

Share:
10,276
maihabunash
Author by

maihabunash

I am 17 years old and love to develop

Updated on June 04, 2022

Comments

  • maihabunash
    maihabunash almost 2 years

    I have the following CSV file:

    more my_file.csv
    Alabama,Alaska,Arizona,Arkansas,California,Colorado,Connecticut,Delaware,Florida,Georgia,Hawaii,Idaho,Illinois,Indiana,Iowa
    1000,"1 0 0 1",1002,1002,1003,1004,1005,"1 0 0 6",1007,1008,1009,1010,1011,1012,1013
    100," 1 0 1 ",102,102,103,104,105,"1 0 6 2",107,108,109,"1 1 0 3 5 62 0",111,112,113
    10001,10011,10021,10021,10031,10041,10051,10061,10071,10081,10091,10101,10111,10121,10131
    .
    .
    .
    .
    

    My target is to set the CSV parameters ( all states in CSV ) with their values in my bash script

    for example ( regarding the second line values )

    in my bash script I will able to read each parameter

    example

     echo $Alabama
     1000 
     echo $Alaska
     1 0 0 1
    

    First I just tried to write the following (wrong) code, in order to set the parameters with their values:

    #!/bin/bash
    
    counter=1
    
    for CSV_COLUMN in Alabama  Alaska  Arizona Arkansas  California  Colorado  Connecticut Delaware Florida  Georgia  Hawaii  Idaho  Illinois  Indiana  Iowa 
    do
      export $CSV_COLUMN=` echo $CSV_LINE | cut -d',' -f$counter `
      counter=$counter+1
    done
    

    The test should be (from the bash script)

    echo $Alabama
    1000
    

    How should I change my code in order to implement my idea?