在我下载大型在线 CSV 文件之前,有没有什么方法可以让我使用它的 URL 从命令行读取几行内容?
答案1
您需要阅读的可能不仅仅是文件的开头:
使用HTTP 内容范围
读书其他部分除了第一个之外,你可以使用 HTTP 请求范围,例如使用 选项--range
,curl
将文件的一部分从某个字节位置移到另一个字节位置:
curl --range 500-700 ...
关于文件格式 CSV - 你会猜猜哪个部分可能会有用,得到那个零件,手动编辑删除部分数据行。
例如,查看从字节 50000 开始的 500 个字节/字符:
URL="http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV"
curl --range 50000-50500 "$URL"
2.79,0000030,201403,
Q44,RXA,Y00327,1108010F0AAABAB,Hypromellose_Eye Dps 0.5% ,0000001,00000000.81,00000000.76,0000010,201403,
Q44,RXA,Y00327,110801000BLAPA0,Blephasol_Lot ,0000001,00000007.53,00000006.97,0000100,201403,
Q44,RXA,Y00327,110801000BLAQA0,Blephaclean_Eye Lid Wipe ,0000001,00000010.68,00000009.89,0000040,201403,
Q44,RXA,Y00327,1201010F0BBAAAA,Locorten-Viof$
注意第一行和最后一行隔断,因为文件的实际部分只是文件的“一些文本”,而不是“一些 CSV 记录”。
当不支持 Range 时
常见的 Web 服务器一般都支持“Range”,
但可能出于某种原因“范围”不起作用
(例如,自定义服务器不支持它,或者由于存在代理人之间)
在这种情况下,我们无法避免下载部分之前的数据我们感兴趣的。但是然后,我们可以按字节或按行剪切出我们需要的部分:
URL="http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV"
curl -s "$URL" | head -c 50500 | tail -c 500
2.79,0000030,201403,
Q44,RXA,Y00327,1108010F0AAABAB,Hypromellose_Eye Dps 0.5% ,0000001,00000000.81,00000000.76,0000010,201403,
Q44,RXA,Y00327,110801000BLAPA0,Blephasol_Lot ,0000001,00000007.53,00000006.97,0000100,201403,
Q44,RXA,Y00327,110801000BLAQA0,Blephaclean_Eye Lid Wipe ,0000001,00000010.68,00000009.89,0000040,201403,
Q44,RXA,Y00327,1201010F0BBAAAA,Locorten-Viof$
一樣!
按行阅读
要获取行而不是字符,请使用-n
而不是-c
。
对于第 100 行到第 110 行(“第 110 行之前的最后 10 行”):
URL="http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV"
curl -s "$URL" | head -n 110 | tail -n 10
Q44,RXA,Y00327,0206030Y0AAAAAA,Ivabradine_Tab 5mg ,0000001,00000020.09,00000018.68,0000028,201403,
Q44,RXA,Y00327,0208010W0AAAIAI,Tinzaparin Sod_Inj 20 000u/ml 0.7ml Pfs ,0000003,00000154.77,00000143.20,0000013,201403,
Q44,RXA,Y00327,0208010W0AAANAN,Tinzaparin Sod_Inj 10 000u/ml 2ml Vl ,0000001,00000021.13,00000019.65,0000002,201403,
Q44,RXA,Y00327,0208020V0AAAAAA,Warfarin Sod_Tab 1mg ,0000002,00000001.34,00000001.37,0000042,201403,
Q44,RXA,Y00327,0209000A0AAAJAJ,Aspirin_Tab 75mg ,0000001,00000000.12,00000000.22,0000004,201403,
Q44,RXA,Y00327,0211000P0AAACAC,Tranexamic Acid_Tab 500mg ,0000001,00000006.31,00000005.85,0000060,201403,
Q44,RXA,Y00327,0212000Y0AAADAD,Simvastatin_Tab 40mg ,0000001,00000000.17,00000000.27,0000004,201403,
Q44,RXA,Y00327,0301011R0AAAPAP,Salbutamol_Inha 100mcg (200 D) CFF ,0000037,00000058.50,00000054.54,0000039,201403,
Q44,RXA,Y00327,0301011R0BEAIAP,Ventolin_Evohaler 100mcg (200 D) ,0000014,00000021.00,00000019.59,0000014,201403,
Q44,RXA,Y00327,0301011V0BBAMAL,Bricanyl_Turbohaler 500mcg (100 D) ,0000001,00000006.92,00000006.41,0000001,201403,
现在,由于 CSV 记录是行,我们有一个干净的部分的开始和结束。
HTTP Content-Range 不支持使用行范围;HTTP 服务器需要读取整个文件(包括范围之前的部分)来计算行数。
答案2
比@musher 的方法稍微快一点:
wget http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV -qO -
将会O
把结果输出到终端的标准输出,而该q
选项会抑制有关下载进度等的内容。您必须相当快地按下Ctrl+C才能停止下载,因为它是文本,所以它会相当快地下载。
这可能也可以工作 - 它应该将前十行下载到标准输出:
wget http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV -qO - | head -10
只要 wget 在10
读完前几行后停止下载就没问题了head
...我检查了一下,wget
似乎在读完前 10 行后就停止下载了。
编辑:wget 命令将被信号关闭SIGPIPE
- 参见这里
您可以通过更改后面的数字来更改读取的行数head -
答案3
为任何读过这篇文章的人编辑:我的答案有效,但继续下去,下面的答案更好。
因此,如果您右键单击可以选择的数据集的实际链接Copy link address
(在 chrome 中,我假设在 Firefox/其他中也有类似的选项)
我能给出的最简单的建议是查看前几行:
打开一个终端,并为您的文件创建一个目录(我将把它放在桌面上并称之为文件)
mkdir -p ~/Desktop/Files
现在,进入该目录..
cd ~/Desktop/Files
现在,使用从上面复制的链接(ctrlshiftV将其粘贴到终端)输入
wget http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV
(这是页面上的第一个链接,供您参考)。
现在,要检查它是否是您想要的,只需点击ctrlC停止文件传输(wget 在该位置查找文件、URL 并下载它。这将停止传输)。一旦停止,使用您最喜欢的文本编辑器通过以下方式打开它
gedit T2014 ...
或者你也可以在命令行中使用以下命令读取
cat T2014 ...
如果这是您想要的,只需重新运行 wget 命令并让它完成。如果不是,您可以安全地删除 T2014 ... 文件。