各位,我问过这个问题5次在这里,并从超级用户那里收到了 5 个单独的代码,这些代码全部失败了。
问题:我将股票信息从 Yahoo Finance 的 API 带回到 txt 文件中。
问题是:从此类有逗号和空格在其中进行分隔简直是一场噩梦,因为在 Excel 中很难进行分隔。Excel 想要将 670,000,000 拆分为 3 个独立的值,并将其拆分到 3 个独立的列中,这简直是笑话。
我怎样才能让 670,000,000 看起来像 670000000。
谁能解答这个很多人都失败的难题。下面的这个脚本是最新失败的。
cd desktop/quoteUpdate
while true
do
curl -o quotes.txt -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1"
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
echo UPDATED:
date
sleep 5
done
答案1
我想我已经为你找到解决方案了......
cd desktop/quoteUpdate
while true
do
curl -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1"|sed -e 's/,/_/1' -e 's/,/_/1' -e's/\(.*\),/\1_/' -e 's/,//g' -e 's/_/,/g' > quotes.txt
echo UPDATED:
date
sleep 5
done
done
尝试一下... 您可以通过简单地将 > quotes.txt 更改为 >> quotes.txt 将数据附加到 quotes.txt 文件中
答案2
从我脑子里想到的丑陋的解决方案应该可以解决问题。用以下内容替换您的 sed 行:
awk 'BEGIN{FS="\"";OFS="\"";}{gsub(",","",$5);$5=","$5;print $0}' quotes.txt > UPDATED_quotes.txt
如果我找到更优雅的答案,我会更新这篇文章。
答案3
您从 Yahoo! 获取的数据是CSV 格式格式太复杂,bash(甚至 sed 或 awk)无法在一行中正确解析。(由于具备完整的图灵机功能,因此任何工具能这样做的话,结果就不好看。)
上述脚本的直接问题是sed
没有提供任何输入,因此脚本挂起(curl
完成后),因为sed
等待stdin
。您可能希望将“quotes.txt”附加到sed
当前的命令行:
sed -e :a -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta' quotes.txt
但是,处理完这个问题后,你还是会不开心,因为 -commandsed
不会解析 CSV 数据。你需要某种 CSV 处理工具——搜索为你最喜欢的脚本语言编写的 CSV 解析包。如果Tcl,可进行 CSV 解析作为...的一部分库, 例如。
最后,如果你真的不需要正确处理 CSV 的所有可能性,而只是确保第三列可以被 Excel 理解,你可以用类似下面的方法作弊:
curl -o - -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1" | \
awk -F, '{
sub("^ *", "", $3); # Start with 3rd field by stripping leading spaces
for (i = 4; i < NF; i++) # Append other fields to 3rd - but the last one
$3 = $3 $i;
print $1 "," $2 "," $3 "," $NF
}'
上述调用将数据直接从curl
发送到awk
(绕过中间文件创建)。如果您需要文件中的数据(例如用于 Excel 加载),请将awk
的最终输出重定向到其中:
.... awk ..... > quotes.csv
顺便说一句,此示例中没有特定于 bash 的内容——任何 shell 都可以。请注意,此awk
脚本仅修改第三列(将后续“列”附加到它,除了最后一列——NF)。还请注意,如果其中一个公司名称中包含逗号,它将失败。如果这对您来说是一个问题,可以使用引号(“)而不是逗号来查找必须合并在一起的数字,从而避免这种情况……但最重要的是,再次使用您最喜欢的脚本语言的 CSV 感知扩展将数据视为正确的 CSV。
答案4
使用 perl 代替 sed
perl -pe 's/,(?=\d{3}(?![.]))//g'
将逗号(后跟三位数字,没有小数点)替换为任何内容。
哦,刚刚看到你还想修剪空格
perl -pe 's/,[ ]+/,/g;s/,(?=\d{3}(?![.]))//g'
这应该在框架中代替“sed”,例如
#!/bin/sh
while true
do
clear
date
curl -s "http://download.finance.yahoo.com/d/quotes.csv?s=goog,aapl,avxl&f=nsj2l1"|\
perl -pe 's/,[ ]+/,/g;s/,(?=\d{3}(?![.]))//g'| tee quotes.csv
cat quotes.csv| sed -e 's/,/\t/g'> quotes.xls
sleep 5
done
您是否知道,如果 csv 文件内的逗号被制表符替换,且扩展名为“.xls”,则 Excel 将“按原样”打开该文件。