Pode não ser apenas o começo do arquivo que você precisa ler:
Para ler outras partes do primeiro, você pode usar uma solicitação HTTP para intervalo , por exemplo, com a opção --range
de curl
, para obter uma parte do arquivo de alguma posição de byte para outra:
curl --range 500-700 ...
Com relação ao formato de arquivo CSV, você poderia adivinhar qual parte poderia ser útil, obter essa parte e editá-la manualmente para remover linhas parciais de dados.
Por exemplo , para dar uma olhada nos 500 bytes / caracteres a partir do byte 50000:
URL="http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV"
e 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$
Observe como a primeira e a última linha são cortadas , já que a parte real do arquivo era "apenas algum texto" do arquivo, e não "alguns registros CSV".
Quando o intervalo não é suportado
Servidores Web comuns suportam "Intervalo" em geral,
mas é possível que por algum motivo "Range" não esteja funcionando
(por exemplo, não é suportado por um servidor personalizado ou não funciona porque existe um proxy entre eles)
Neste caso, não podemos evitar fazer o download dos dados antes da parte em que estamos interessados. Mas, então, podemos cortar a parte que precisamos, por bytes ou por linhas:
URL="http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV"
e 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$
Da mesma forma!
Lido por linha
Para obter linhas, em vez de caracteres, use -n
em vez de -c
.
Para as linhas 100 a 110 ("as últimas 10 linhas das linhas até 110"):
URL="http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV"
e 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,
Agora, como os registros CSV são linhas, temos um começo e um fim limpos da seção.
O intervalo de conteúdo HTTP não suporta o uso de intervalos de linha; O servidor HTTP precisaria ler o arquivo inteiro, incluindo a parte antes do intervalo, para contar números de linha.