2013-07-14 4 views
2

J'utilise un fichier .bat pour déplacer un fichier CSV créé tous les jours. Je dois maintenant nettoyer:Nettoyer un fichier CSV

  • trouver et remplacer « - » à 0
  • Rechercher et remplacer les cellules vides avec 0
  • supprimer tous les espaces

Le CSV est seulement 20 lignes .

+0

http://blogs.technet.com/b/heyscriptingguy/archive/2005/02/08/how-can-i-find-and-replace-text-in-a-text-file.aspx - probablement le moyen le plus simple . – npocmaka

+0

Certains exemples de données seraient d'une aide considérable. Vous devez montrer le formulaire avant et après. En l'état, vous demandez juste combien de temps est un morceau de ficelle? – Magoo

Répondre

2

Je ne sais pas vraiment ce dont vous avez besoin. S'il vous plaît expliquer plus, si cela ne fonctionne pas pour vous:

for /f "delims=" %%a in (old.csv) do (
    set "line=%%a" 
    setlocal enabledelayedexpansion 
    set "line=!line: =!" 
    set "line=!line:-=0!" 
    >> new.csv echo(!line! 
    endlocal 
) 
+0

'set" line =! Line: ,, =, 0,! "' Je pense qu'il veut aussi ce changement, – foxidrive

+0

@foxidrive Ne fonctionnera pas correctement avec 2 champs vides adjacents ou plus dans une rangée. Ne fonctionnera pas non plus pour les champs vides précédant/suivant. –

+0

@Ansgar Wiechers Oui, ce n'est pas très utile. Sur trois champs adjacents, il a sauté le second, ainsi que les suivants. – foxidrive

0

Les fichiers batch ne sont pas un bon outil pour cela. Vous seriez bien mieux en utilisant PowerShell:

(Get-Content 'C:\path\to\in.csv') ` 
    -replace ' ', '' ` 
    -replace '-', '0' ` 
    -replace '^,', '0,' ` 
    -replace ',$', ',0' ` 
| % { 
    while ($_ -match ',,') { $_ = $_ -replace ',,', ',0,' } 
    $_ 
} | Out-File 'C:\path\to\out.csv' 

ou même VBScript:

Set fso = CreateObject("Scripting.FileSystemObject") 

inFilename = "C:\path\to\in.csv" 
outFilename = "C:\path\to\out.csv" 

Set inFile = fso.OpenTextFile(inFilename) 
Set outFile = fso.OpenTextFile(outFilename, 2, True) 

outFile.WriteLine inFile.ReadLine 'write header 
Do Until inFile.AtEndOfStream 
    line = inFile.ReadLine 

    line = Replace(line, " ", "") 
    line = Replace(line, "-", "0") 
    If Left(line, 1) = "," Then line = "0" & line 
    If Right(line, 1) = "," Then line = line & "0" 
    Do While InStr(line, ",,") > 0 
    line = Replace(line, ",,", ",0,") 
    Loop 

    outFile.WriteLine line 
Loop 

inFile.Close 
outFile.Close 
0
@ECHO OFF 
SETLOCAL 
(
FOR /f "delims=" %%i IN (yourfile.csv) DO (
SET "line=%%i"&CALL :process 
) 
)>newcsv.csv 
GOTO :EOF 

:process 
SET line=%line: =% 
SET line=%line:-=0% 
SET line2=%line% 
SET line=%line:,,=,0,% 
IF NOT "%line%"=="%line2%" GOTO process 
IF "%line:~0,1%"=="," SET line=0%line% 
ECHO %line% 
GOTO :EOF 

Maintenant les fées interweb sont enfin de retour à bord, voici ma version ...

+0

Merci pour votre aide – user1870243

+0

J'ai essayé ce code et le code de réponse. Le résultat que j'obtiens est un Coloumn de signes pour les deux. Donc je peux faire quelque chose d'incorrect ou l'expliquer mal. J'ai un fichier csv par exemple ID, -, C, et je voudrais le changer en ID, C, 0,198, mm, – user1870243

+0

Désolé, je frappe enter avant de terminer par exemple -, IM ,, 198,0, à 0, IM, 0,198,0, Ci-dessous le code que j'ai tapé @ECHO OFF SETLOCAL ( POUR/f "delims =" %% i IN (recon_S21206.csv) DO ( SET "ligne = %% i" & APPELER: PROCESSUS ) )> new.csv GOTO: EOF : processus ligne de set =% line: =% ensemble ligne = ligne%: - = 0% ensemble line2 =% line: ,, =, 0 ,! " SI NON"% ligne% "=="% ligne2% "GOTO processus SI"% ligne: ~ 0,1% "==", "SET ligne = 0% ligne% ECHO% line% GOTO:% EOF – user1870243

Questions connexes