Impossible d'obtenir un nombre précis d'enregistrements d'un fichier csv

0

J'ai un fichier .csv qui a certaines valeurs formatées comme des paragraphes avec des sauts de ligne ou parfois des puces.

"STAT","ID","DESC"
"UPD", "1", "Updated"
"CHG", "2", "Changed"
"UPD", "3", "Updated.
Might have to update again"
"UPD", "4", "Updated.

 - once 
 - twice
 - thrice
"
"DEL", "5", "unknown"
"DEL", "6", "Deleted
Need to restore"

J'ai besoin de compter le nombre d'enregistrements, utilisé par awk comme ci-dessous puisque je savais que la 2e colonne était un identifiant unique mais renvoyait plus que le mien. Le texte ci-dessus est bien sûr un mannequin, car je ne suis pas autorisé à partager l'original mais j'ai essayé de réfléchir aussi fidèlement que possible.

 awk  '{print $2}' FS=","  sample.csv | wc -l 

J'ai même imprimé la première colonne en utilisant awk '{print $ 1}' pour vérifier uniquement les valeurs de la première colonne, mais la sortie affiche les parties de départ de la nouvelle ligne dans les paragraphes.

S'il vous plaît laissez-moi savoir si des informations supplémentaires sont nécessaires et je mettrai à jour la question.

vchollati
la source
Que faites-vous avec le résultat? Devez-vous utiliser awk? Si vous voulez juste l'info, essayez nirsoft csvfileviewer
yosh m
Je dois compter le nombre d'enregistrements via la ligne de commande Unix, dans le cadre de l'automatisation d'une tâche de test (comptez le nombre d'enregistrements à chaque fois que nous obtenons un fichier CSV mis à jour d'un fournisseur). Je peux ouvrir dans Excel et voir le numéro correct une fois, mais comme je dois automatiser ce processus dans la ligne de commande unix, j'essaie d'utiliser awk. Je n'ai accès à aucun autre outil / package, à l'exception de ceux qui font partie de la ligne de commande. Comme sed, grep et awk.
vchollati

Réponses:

0

Une façon de faire awkest avec

awk -v RS=$'"\n"' 'END {print NR}' sample.csv
  • RS=$'"\n"'définit la R ECORD S eparator (qui est de saut de ligne par défaut) pour la chaîne de trois caractères ", saut de ligne, ". Cette syntaxe pourrait ne fonctionner que dans bash. Cela entraînera la décomposition de votre fichier dans les enregistrements suivants:

    1: "STAT","ID","DESC

    2: UPD", "1", "Updated

    3: CHG", "2", "Changed

    4: UPD", "3", "Updated.
        Might have to update again

    5: UPD", "4", "Updated.
       
        - once
        - twice
        - thrice
       

    6: DEL", "5", "unknown

    sept: DEL", "6", "Deleted
        Need to restore"

    Cela suppose qu'il n'y a pas de blancs de fin dans le fichier. 

  • 'END {print NR}' lit le fichier jusqu’à la fin puis imprime le numéro de l’enregistrement, c’est-à-dire le nombre d’enregistrements.

Les fichiers texte sont généralement considérés comme une séquence de lignes délimitée par des caractères de nouvelle ligne ou des séquences de caractères. Et, généralement, un «enregistrement» dans un fichier texte est considéré comme une ligne. Mais awkvous permet de spécifier un séparateur d’enregistrement autre que newline. Étant donné que la chaîne quote-newline-quote apparaît entre chaque paire d' enregistrements consécutifs de votre fichier, le spécifier comme séparateur d'enregistrement divise le fichier en enregistrements (presque identiques) aux enregistrements souhaités.

Mais le séparateur d'enregistrement est comme le mur entre deux pièces: il ne fait partie d'aucune des deux. En awktraitement normal , les enregistrements sont des lignes sans caractères de nouvelle ligne - ils sont supprimés. De même, dans ma réponse, les séquences quote-newline-quote sont supprimées. Mais, puisqu'il n'y a pas de séparateur d'enregistrement avant ou après le dernier enregistrement, les tout premiers et derniers caractères de citation ne sont pas supprimés.

Si vous souhaitez traiter le fichier, enregistrement par enregistrement, cette solution risque de ne pas suffire, car le premier enregistrement et les derniers enregistrements sont traités différemment. Je suis (un peu) d'accord avec la recommandation de Glenn selon laquelle, pour tout travail sérieux, vous devriez utiliser un «analyseur syntaxique CSV approprié».

G-Man
la source
Je ne comprends pas très bien comment l'élimination de la citation de fin et de la citation de début pour chaque enregistrement (sauf les 1er et dernier enregistrements) a permis de compter correctement, la solution a néanmoins fonctionné.
vchollati
Supprimer la citation de fin et la citation de début pour chaque enregistrement (sauf les 1er et dernier enregistrements) n'est pas la solution; c'est un effet secondaire de la réponse. "Je ne comprends pas comment ça marche ..." ... Voir les modifications.
G-Man
Explication clarifiée, très appréciée.
vchollati
0

Je recommande fortement de choisir une langue avec un analyseur CSV approprié. J'aime le rubis pour ça, c'est très concis:

ruby -rcsv -e 'a = CSV.read(ARGV[0], :col_sep => ", "); puts a.length' file
7

J'ai dû modifier les séparateurs de colonnes dans la ligne d'en-tête pour ajouter des espaces.

Glenn Jackman
la source
Ok, il suffit de cocher en ligne et Ruby pourrait être installé par défaut sur la plupart des distributions Linux. Va vérifier demain et mettre à jour le post. Je vous remercie.
vchollati