从命令行使用其 URL 读取大量在线 CSV 文件的一部分

Fre*_*red 2 command-line

在下载之前,有什么方法可以使用命令行中的 URL 读取大型在线 CSV 文件的几行?

Vol*_*gel 8

您需要阅读的可能不仅仅是文件的开头:

使用HTTP 内容范围

要读取除第一个部分之外的其他部分,您可以对range使用 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$   
Run Code Online (Sandbox Code Playgroud)

请注意第一行和最后一行是如何被截断的,因为文件的实际部分是文件的“一些文本”,而不是“一些 CSV 记录”。

不支持范围时

常见的 Web 服务器通常支持“Range”,
但可能由于某种原因“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$   
Run Code Online (Sandbox Code Playgroud)

一样!

按行读取

要获取行而不是字符,请使用-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,
Run Code Online (Sandbox Code Playgroud)

现在,由于 CSV 记录是行,我们有一个干净的开始和结束部分。

HTTP Content-Range 不支持使用行范围;HTTP 服务器需要读取整个文件,包括范围之前的部分,以计算行号。