2010-11-10 6 views
1

J'ai un gros fichier avec des dizaines de milliers de lignes contenant des données séparées par | pour l'insertion en bloc dans ma base de données. Je sais qu'il devrait y avoir 10 colonnes. Étant donné que certaines données peuvent contenir accidentellement le délimiteur |, des erreurs peuvent se produire car le nombre de colonnes ne correspond pas pour cette ligne.Comment vérifier le nombre de colonnes pour chaque ligne dans un fichier csv?

Je suis en train de compter le nombre de lignes qui ont plus de 20 colonnes pour vérifier que le fichier est valide:

@ECHO OFF 
set /a count=0 
FOR /f "tokens=10,* delims=|" %%i in (%1) DO (
    if not "%%j"=="" (
    set /a count+=1 
) 
) 
echo %count% 
:eof 

Il fonctionne bien ... mais seulement si aucun champ est vide, dans ce cas, le nombre est déplacé parce que delims poignées délimiteurs comme des espaces blancs

e.g 
    1|2|3|4|5|6|7|8|9|10 => cool, 10 columns 
    1|2|3|4|5|6|7|8|almost got|you|10 => found 11 columns 
    1|2|3|4||6|7|8|got|you|10 => damn, reports as 10 columns 

Comment puis-je résoudre ce en utilisant uniquement la ligne de commande/lot de Windows?

N.B. Je ne peux pas modifier le fichier pour inclure des données entre guillemets ou quelque chose.

Répondre

1

Vous pouvez utiliser findstr et lui donner une regex. Alors disons que vous savez que votre ligne a au moins 10 colonnes, ce qui signifie qu'elle a au moins 9 caractères de tuyau. Et vous voulez trouver quelles lignes ont 10 caractères de pipe ou plus. Nous pouvons trouver ce regex:

.*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.* Line has at least 10 pipe characters, meaning 
            some data field contains a pipe character. 

donner cette regex à findstr.

findstr /R ".*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*" data.txt 

Ceci imprime toutes les lignes mal formées. Donnez la sortie de cela à find /c pour compter le nombre de lignes qu'il crache.

findstr /R ".*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*" data.txt | find /c "|" 

Exemple data.txt:

1|2|3|4|5|6|7|8|9|10     good - 10 columns 
1|2|3|4|5|6|7|8|almost got|you|10 bad - 11 columns 
1|2|3|4||6|7|8|got|you|10   bad - 11 columns 
1|2|3|4|5|6|7|8|9||     bad - 11 columns 
1|2|3|4|5|6|7|8|9     good - 10 columns 
1|2|3|4|5|6|7      gotcha - less than 10 columns not detected 
1|2|3|4|5|6|7|8|9|     good - 10 columns 
|||||||||       good - 10 columns 
||||||||||       bad - 11 columns 

C:\>findstr /R "^.*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*$" data.txt 
1|2|3|4|5|6|7|8|almost got|you|10 bad - 11 columns 
1|2|3|4||6|7|8|got|you|10   bad - 11 columns 
1|2|3|4|5|6|7|8|9||     bad - 11 columns 
||||||||||       bad - 11 columns 

C:\>findstr /R "^.*|.*|.*|.*|.*|.*|.*|.*|.*|.*|.*$" data.txt | find /c "|" 
4 
+0

Grand, ne savait même pas findstr existait – hoang

Questions connexes