Reputation: 12230
Just wondering how can I add single quotes around fields, so I can import it to mysql without warnings or errors.
I have a csv file with lots of content.
16:47:11,3,r-4-VM,250000000.,0.50822578824,131072,0,0,0,0,0
Desired output
'16:47:07','3','r-4-VM','230000000.','0.466028518635','131072','0','0','0','60','0'
I really have no idea where to start, your help is highly appreciated.
Upvotes: 5
Views: 11313
Reputation: 1
awk 'BEGIN{FS=OFS=","}{for (i=1;i<=NF;++i) $i="~"$i"~"}{print}' $input_csv_file
This works. Here I am enclosing all the csv file columns with a ~
.
Upvotes: 0
Reputation: 4209
awk
and sed
are not going to (easily) determine whether the field separator (,
) is escaped or not. The csv file format escapes ,
characters within fields by surrounding the whole field in double quotes (see Section 2.6 of RFC4180).
As I describe in this answer, a more robust method is to use a csv library, rather than parsing as text using regular expressions and the like.
I found Python's library was the best choice because it's:
Based on the question's tags, I suspect these criteria will be appealing to you too.
Thus, try the following:
QUOTE_CSV_PY="import sys; import csv; csv.writer(sys.stdout, quoting=csv.QUOTE_ALL, quotechar=\"'\").writerows(csv.reader(sys.stdin))"
python -c "$QUOTE_CSV_PY" < file
To break it down:
QUOTE_CSV_PY
is a shell variable containing the Python one-liner commandsstdout
) with QUOTE_ALL
set so all fields get quoted using quotechar
, which is set to a single quote;stdin
).file
) into its stdin
.Upvotes: 2
Reputation: 58578
This might work for you (GNU sed):
sed -r 's/[^,]+/'\''&'\''/g' file
or:
sed -r "s/[^,]+/'&'/g" file
Upvotes: 1
Reputation: 13250
You could try this
awk -F"," -v quote="'" -v OFS="','" '$1=$1 {print quote $0 quote}' file
(-F"," -v OFS="','")
(print quote $0 quote)
Upvotes: 20
Reputation: 195289
try this:
awk '{gsub(/^|$/,"\x027");gsub(/,/,"\x027,\x027")}7' file
example
kent$ echo "16:47:11,3,r-4-VM,250000000.,0.50822578824,131072,0,0,0,0,0"|awk '{gsub(/^|$/,"\x027");gsub(/,/,"\x027,\x027")}7'
'16:47:11','3','r-4-VM','250000000.','0.50822578824','131072','0','0','0','0','0'
Upvotes: 1
Reputation: 76775
#!/usr/bin/awk -f
BEGIN { FS=OFS=","}
{
for (i = 1; i <= NF; ++i)
$i = "'" $i "'"
print
}
At the beginning, set FS
(the field separator) to a comma; also set OFS
, the output field separator, to a comma.
For every input line, loop over all fields. NF
is the number of fields parsed out of the current line. Set each field to its own value surrounded by single quotes.
When done updating the fields, print the modified line.
Upvotes: 1