-1
votes

Utilisation d'un fichier de commandes, comment puis-je déterminer le nombre de champs dans un fichier CSV?

Je reçois un enregistrement, (ligne) , d'un fichier et besoin de produire le nombre de champs, (colonnes) , il contient.

Donc, par exemple, (Inclus champs vides) : xxx

J'ai pensé à compter le nombre de séparateurs de champs, (virgules) , dans le Enregistrez mais les données sur le terrain peuvent également contenir des virgules.

Les expressions régulières seraient appropriées pour cette tâche?


1 commentaires

Voir Stackoverflow.com/q/24927944/2191572 pour savoir comment lire correctement un fichier CSV en lot.


4 Réponses :


-2
votes

Utilisez le script awk comme ceci: xxx


0 commentaires

2
votes

Étant donné que les cellules CSV ne contiennent que des caractères imprimables et que les guillemets " code> sont utilisés pour joindre du texte contenant , code>, vous pouvez procéder comme suit:

  • Lire une ligne li>
  • Supprimez les caractères génériques problématiques (pour ne pas déranger pour code> plus tard) li>
  • Supprimer les séparateurs de jeton standard sauf , code> (pour laisser pour code> uniquement séparé sur , code> ultérieurement) li>
  • enfermez chaque champ de guillemets li>
  • boucle sur les champs (en utilisant pour code>) et comptez-les li> ul>

    Le code suivant pourrait être utilisé pour cela (les données CSV devraient résider dans le fichier donnée en tant que premier argument de ligne de commande): p> xxx pré> p> Exemple de données d'entrée: P>

    14: unquoted,"quoted",unquoted space,"quoted space","quoted,comma",unquoted;&|!^,"quoted;&|!^",(unquoted parens),"(quoted parens)",,next empty,,asterisk*,equal=to
    


6 commentaires

Je n'ai pas testé, mais je suis à peu près sûr que votre étape de votre champ de citation »échoue. Les champs déjà cités contenant , seront divisés en plusieurs champs.


@dbenham, je n'ai pas non pas testé jusqu'à présent ... L'idée était que chaque , devient remplacé par "", ", puis La chaîne entière devient enfermée dans "" , de sorte que vous obtenez essentiellement tous les champs ci-joints dans "" ; Les champs contenant , à leur propre doivent être cités, le résultat est donc "" abc "," def "" , par exemple, par exemple, par exemple, par exemple, car la virgule au milieu est citée. et ainsi protégé de pour ; Pour que cela fonctionne, je supprimai tous les autres (imprimables) séparateur de jeton standard ...


Cas de test simple "A, B" devrait évaluer à 1 champ. Mais cela devient "A", "B" qui analyse comme 2 jetons. Donc, je ne vois pas comment cela peut fonctionner.


Non, @dbenham, "A, B" devient "" A "," B "" ", qui est un champ comme prévu ...


Ugh - désolé j'étais si dense. J'aurais dû passer simplement testé. Bien sûr, tu as raison.


Le script peut maintenant manipuler même les données CSV contenant * et = ...



2
votes

8 commentaires

Stephan, veuillez noter que j'ai édité la question à inclure une déclaration sur les champs vides dans l'exemple d'enregistrement. J'avais déjà pensé qu'il était inutile de mentionner, (que l'exemple était suffisant) , mais compte tenu de votre dernière modification, j'ai des choses clarifiées; Pardon!


Je suppose que le café n'était pas assez fort ce matin ... Changement simple. Voir mon édition.


Nope, toujours des problèmes potentiels si des valeurs contiennent * et / ou ? wildcards


Aussi des problèmes si les valeurs non notées contiennent & , << / code>, > ou | | |


@DBENHAM Aussi = ou même des espaces. J'ai orienté mon code selon l'exemple de la question.


Merci pour ça. Pourriez-vous expliquer ce que (% ligne:, = x, x%) signifie? Je suis totalement nouveau dans les scripts de lot, donc je ne le comprends pas.


également. Je suppose que j'aurais dû donner un meilleur exemple, mais essentiellement, les cellules peuvent tout contenir. Toute sorte de symboles, de virgules, de speambématiques, etc. Cela pourrait-il faire face à ces belles?


cmd n'a aucune idée de csv . Nous ne pouvons que gérer le texte. Il est donc difficile de travailler avec csv "correctement" dans tous les cas. Cela signifie beaucoup de code difficiles à comprendre et à découper des erreurs. Si PowerShell est une option, je suggère fortement d'utiliser cela à la place.