2 votes

Lire une partie d'un fichier CSV massif en ligne en utilisant son URL depuis la ligne de commande

Existe-t-il un moyen de lire quelques lignes d'un énorme fichier CSV en ligne en utilisant son URL en ligne de commande avant de le télécharger ?

8voto

Volker Siegel Points 12033

Il se peut que ce ne soit pas seulement le début du fichier que vous deviez lire :

Utilisez HTTP Content-Range

A lire autres parties que la première, vous pourriez utiliser une requête HTTP pour une gamme par exemple avec le --range option de curl pour faire passer une partie du fichier d'une position d'octet à une autre :

curl --range 500-700 ...

En ce qui concerne le format de fichier CSV, vous devriez devinez quelle partie pourrait être utile, prenez cette partie, et le modifier manuellement pour supprimer des lignes partielles de données.

Par exemple pour examiner les 500 octets/caractères à partir de l'octet 50000 :

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$   

Notez comment la première et la dernière ligne sont coupez car la partie réelle du fichier était "juste un peu de texte" du fichier, et non "quelques enregistrements CSV".

Lorsque la gamme n'est pas prise en charge

Les serveurs web courants prennent en charge le "Range" en général,
mais il est possible que pour une raison quelconque La "gamme" ne fonctionne pas
(par exemple, il n'est pas pris en charge par un serveur personnalisé, ou il ne fonctionne pas parce qu'il y a une proxy entre les deux)

Dans ce cas, nous ne peut éviter pour télécharger le données avant la partie qui nous intéresse. Mais ensuite, nous pouvons découper la partie dont nous avons besoin, par octets, ou par lignes :

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$   

C'est pareil !

Lire par ligne

Pour obtenir des lignes, au lieu de caractères, utilisez -n 代わりに -c .
Pour les lignes 100 à 110 ("les 10 dernières lignes des lignes jusqu'à 110") :

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,

Maintenant, comme les enregistrements CSV sont des lignes, nous avons un début et une fin de section propres.

La plage de contenu HTTP ne prend pas en charge l'utilisation de plages de lignes ; le serveur HTTP devrait lire l'ensemble du fichier, y compris la partie située avant la plage, pour compter les numéros de ligne.

3voto

Wilf Points 28034

Une solution un peu plus rapide que celle de @musher serait de faire ça :

wget http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV -qO - 

El O affichera les résultats sur stdout dans le terminal, tandis que la commande q supprime les informations sur la progression du téléchargement, etc. Vous devez appuyer sur Ctrl + C assez rapidement pour arrêter le téléchargement, car comme c'est du texte, il se téléchargera assez rapidement.

Diese könnte fonctionne également - il devrait télécharger sur stdout les dix premières lignes :

wget http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV -qO - | head -10

Ça devrait aller tant que wget arrête le téléchargement après le premier 10 les lignes sont passées par head ... J'ai vérifié et wget semble arrêter le téléchargement après la lecture des 10 premières lignes.
Editar: La commande wget sera fermée par le signal SIGPIPE - voir aquí

Vous pouvez changer le nombre de lignes lues en changeant le nombre après head -

1voto

Mitch Points 4387

EDIT pour ceux qui lisent ceci après : Ma réponse fonctionne, mais continuez, les réponses ci-dessous sont meilleures.

Si vous cliquez avec le bouton droit de la souris sur les liens vers les ensembles de données, vous pouvez sélectionner Copy link address (dans chrome, je suppose que des options similaires existent dans Firefox/autres)

Le conseil le plus simple que je puisse donner pour regarder les quelques lignes supérieures est le suivant :

Ouvrez un terminal, et créez un répertoire pour vos fichiers (je le mettrai sur le bureau et l'appellerai Files).

mkdir -p ~/Desktop/Files

Maintenant, allez dans ce répertoire..

cd ~/Desktop/Files

maintenant, en utilisant le lien que vous avez copié ci-dessus ( ctrlshiftV pour le coller dans le terminal) tapez

wget http://datagov.ic.nhs.uk/presentation/2014_03_March/T201403PDPI+BNFT.CSV

(c'est le premier lien de la page, pour votre information).

Maintenant, pour vérifier que c'est ce que vous voulez, il suffit de cliquer sur ctrlC pour arrêter le transfert du fichier (wget recherche le fichier à cet emplacement, l'URL, et le télécharge. Cela arrête le transfert). Une fois qu'il est arrêté, utilisez votre éditeur de texte préféré pour l'ouvrir via

gedit T2014 ...

ou vous pouvez le lire en ligne de commande avec

cat T2014 ...

Si c'est ce que vous voulez, exécutez à nouveau la commande wget et laissez-la se terminer. Sinon, vous pouvez supprimer le fichier T2014 ... en toute sécurité.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X