-
-
Save DecisionNerd/3de707bc656cf757a0cb to your computer and use it in GitHub Desktop.
| #!/bin/bash | |
| # CSV to JSON converter using BASH | |
| # original script from http://blog.secaserver.com/2013/12/convert-csv-json-bash/ | |
| # thanks SecaGuy! | |
| # Usage ./csv2json.sh input.csv > output.json | |
| input=$1 | |
| [ -z $1 ] && echo "No CSV input file specified" && exit 1 | |
| [ ! -e $input ] && echo "Unable to locate $1" && exit 1 | |
| read first_line < $input | |
| a=0 | |
| headings=`echo $first_line | awk -F, {'print NF'}` | |
| lines=`cat $input | wc -l` | |
| while [ $a -lt $headings ] | |
| do | |
| head_array[$a]=$(echo $first_line | awk -v x=$(($a + 1)) -F"," '{print $x}') | |
| a=$(($a+1)) | |
| done | |
| c=0 | |
| echo "{" | |
| while [ $c -lt $lines ] | |
| do | |
| read each_line | |
| if [ $c -ne 0 ]; then | |
| d=0 | |
| echo -n "{" | |
| while [ $d -lt $headings ] | |
| do | |
| each_element=$(echo $each_line | awk -v y=$(($d + 1)) -F"," '{print $y}') | |
| if [ $d -ne $(($headings-1)) ]; then | |
| echo -n ${head_array[$d]}":"$each_element"," | |
| else | |
| echo -n ${head_array[$d]}":"$each_element | |
| fi | |
| d=$(($d+1)) | |
| done | |
| if [ $c -eq $(($lines-1)) ]; then | |
| echo "}" | |
| else | |
| echo "}," | |
| fi | |
| fi | |
| c=$(($c+1)) | |
| done < $input | |
| echo "}" |
#!/bin/bash
CSV to JSON converter using BASH
Usage ./csv2json input.csv > output.json
input=$1
[ -z $1 ] && echo "No CSV input file specified" && exit 1
[ ! -e $input ] && echo "Unable to locate $1" && exit 1
read first_line < $input
a=0
headings=echo $first_line | awk -F, {'print NF'}
lines=cat $input | wc -l
while [ $a -lt $headings ]
do
head_array[$a]=$(echo
a=$(($a+1))
done
c=0
echo "["
while [ $c -le $lines ]
do
read each_line
if [ $c -ne 0 ]; then
d=0
echo -n "{"
while [ $d -lt $headings ]
do
each_element=$(echo
if [
echo -n ""${head_array[$d]}":"$each_element","
else
echo -n ""${head_array[$d]}":"$each_element""
fi
d=$(($d+1))
done
if [
echo "}"
else
echo "},"
fi
fi
c=$(($c+1))
done < $input
echo "]"
This should give with quatation and array of json objects
Question, the script runs fine but does not output a json file?
Problem if field value have more than 254 characters.After that field every other field will the same
I have a field that has the following value
"doc":0000000000000000000000000000000000000000000000000000000000000000,
what is interesting is that the all zeros is failing to be parsed by JSON tools ...
they either want a 0 or a "0000000000000000000000000000000000000000000000000000000000000000"
Is there a way that we can put quotes around all values even if they are numbers? or is that outside the accepted formatting of JSON?
@linosteenkamp's version does not work with CSV that contain quoted comma (",") e.g.
printf "head1,head2,head3\n1,\"foo, bar, baz\",\"foo bar baz\"" | ./csv2json.shwill result inQuick fix for @outwitevil's script (https://gist.github.com/dsliberty/3de707bc656cf757a0cb#gistcomment-2103308) is to replace the
\rin thesedregex with$(printf '\r'). The script will still struggle with empty lines, so you have to delete them beforehand. A simple one-linerI haven't checked if there are any side effects on Linux now.