Je reçois un enregistrement, (ligne) em>, d'un csv fichier et besoin de produire le nombre de champs, (colonnes) em>, il contient. Donc, par exemple, (Inclus champs vides) em> strud>: p> J'ai pensé à compter le nombre de séparateurs de champs, (virgules) em>, dans le Enregistrez mais les données sur le terrain peuvent également contenir des virgules. P> Les expressions régulières seraient appropriées pour cette tâche? P> P>
4 Réponses :
Utilisez le script awk code> comme ceci:
Étant donné que les cellules CSV ne contiennent que des caractères imprimables et que les guillemets 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> " code> sont utilisés pour joindre du texte contenant
, code>, vous pouvez procéder comme suit:
pour code> plus tard) li>
, code> (pour laisser
pour code> uniquement séparé sur
, code> ultérieurement) li>
pour code>) et comptez-les li>
ul>
14: unquoted,"quoted",unquoted space,"quoted space","quoted,comma",unquoted;&|!^,"quoted;&|!^",(unquoted parens),"(quoted parens)",,next empty,,asterisk*,equal=to
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 , code> seront divisés en plusieurs champs.
@dbenham, je n'ai pas non pas testé jusqu'à présent ... L'idée était que chaque i> , code> devient remplacé par
"", " code>, puis La chaîne entière devient enfermée dans
"" code>, de sorte que vous obtenez essentiellement tous les champs ci-joints dans
"" code>; Les champs contenant
, code> à leur propre doivent être cités, le résultat est donc
"" abc "," def "" code>, par exemple, par exemple, par exemple, par exemple, car la virgule au milieu est citée. et ainsi protégé de
pour code>; Pour que cela fonctionne, je supprimai tous les autres (imprimables) séparateur de jeton standard ...
Cas de test simple "A, B" code> devrait évaluer à 1 champ. Mais cela devient
"A", "B" code> qui analyse comme 2 jetons. Donc, je ne vois pas comment cela peut fonctionner.
Non, @dbenham, "A, B" code> devient
"" A "," B "" " code>, 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 * code> et
= code> ...
Vous avez besoin de la longueur de la [chaîne] et de la longueur de la [chaîne sans virgule].
Voici une implémentation simple pour un démarrage:
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) i>, 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 * code> et / ou
? Code> wildcards
Aussi des problèmes si les valeurs non notées contiennent & code>,
<< / code>,
> code> ou
| code> | code> | code>
@DBENHAM Aussi = code> 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 code> n'a aucune idée de
csv code>. Nous ne pouvons que gérer le texte. Il est donc difficile de travailler avec
csv code> "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.
En supposant que vous avez déjà une ligne représentative dans une variable, le lot pure suivant peut déterminer de manière fiable le nombre de champs, à condition qu'aucun champ ne contienne un caractère de nouvelle ligne. La spécification Microsoft pour CSV permet de nouvelles lignes dans des champs, mais elles sont rares et que le problème peut probablement être ignoré.
Le code permet de tout autre caractère dans un champ et des comptes pour les littéraux de la virgule indiqués dans des champs, ainsi que Doublé des citations représentant une citation littérale. P>
L'algorithme est un dérivé d'un technique utilisée par Jeb pour analyser correctement les chemins dans la variable de chemin . Dans ce cas, le - - P> ; code> est un délimiteur, mais des chemins cités peuvent contenir
; code> littéraux. P>
line=,,<&^|>!,,1,2,,,"4,<&^|>!0",5,"a,""b"",c",,
13 fields
Voir Stackoverflow.com/q/24927944/2191572 pour savoir comment lire correctement un fichier CSV en lot.