2017-10-02 2 views
0

J'essaie de supprimer par lots ou vbs le texte délimité par des virgules (CSV) qui sont toujours dans la même position. Cela n'affecterait pas la première ligne, seulement les lignes 2 et suivantes.Suppression/remplacement de caractères délimités par des virgules

texte Exemple de fichier:

Code,Batch,File #,Reg Hours,O/T,Cost Number,Rate,Earnings,Earnings,Memo Code,Memo Amount,Earnings Code,Earnings Amount,Hours Code,Hours Amount,Earnings Code,Earnings Amount,Adjust Code,Adjust Amount 
ABC,123,3980 ,78.52,,12331,10.00,,,,,,,, 
ABC,123,4026 ,29.38,,12331,10.00,,,,,,,, 
ABC,123,5065 ,64.46,,12331,10.00,,,,,,,, 
ABC,123,5125 ,80.00, 0.54,12331,11.00,,,,,,,, 

Je voudrais finir avec le texte:

Code,Batch,File #,Reg Hours,O/T,Cost Number,Rate,Earnings,Earnings,Memo Code,Memo Amount,Earnings Code,Earnings Amount,Hours Code,Hours Amount,Earnings Code,Earnings Amount,Adjust Code,Adjust Amount 
ABC,123,3980 ,78.52,,12331,,,,,,,,, 
ABC,123,4026 ,29.38,,12331,,,,,,,,, 
ABC,123,5065 ,64.46,,12331,,,,,,,,, 
ABC,123,5125 ,80.00, 0.54,12331,,,,,,,,, 

La seule différence est la zone Taux. C'est la septième valeur séparée de la gauche, ou la neuvième de la droite. La première ligne reste intacte.

Y a-t-il un moyen pour le batch/vbs de déterminer la position de la valeur séparée par des virgules, de supprimer la valeur ou de la remplacer par 'nothing', et d'ignorer la première ligne?

Pour cet exemple, on peut supposer le fichier sera toujours nommé file.csv et situé dans D: \ emplacement - 'D: \ emplacement \ file.csv'

Merci!

Répondre

0
REM <!-- language: lang-dos --> 
@ECHO Off 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir" 
SET "destdir=U:\destdir" 
SET "filename1=%sourcedir%\q46534752.txt" 
SET "outfile=%destdir%\outfile.txt" 

:: Remove the output file 

DEL "%outfile%" >NUL 2>nul 

:: To reproduce the first line intact 

FOR /f "usebackqdelims=" %%a IN ("%filename1%") DO >"%outfile%" ECHO %%a&GOTO hdrdone 

:hdrdone 

(
REM to process the header line, remove the "skip=1" from the "for...%%a" command 
FOR /f "usebackqskip=1delims=" %%a IN ("%filename1%") DO (
REM step 1 - replace all commas with "|," to separate separators 
SET "line=%%a" 
SET "line=!line:,=|,!" 
FOR /f "tokens=1-7*delims=|" %%A IN ("!line!") DO (
    SET "line=%%A%%B%%C%%D%%E%%F%%H" 
    ECHO !line:^|=! 
) 
) 
)>>"%outfile%" 

GOTO :EOF 

Vous devez modifier les paramètres de sourcedir et destdir en fonction de votre situation.

J'ai utilisé un fichier nommé q46534752.txt contenant vos données pour mes tests.

produit le fichier défini en% outfile%

Traitement de la ligne d'en-tête est un problème. Le code tel que présenté doit faire ce que vous demandez, mais il semble illogique de conserver le nom de la colonne dans le fichier résultant lorsque le processus est destiné à supprimer cette colonne. Pour traiter également la ligne d'en-tête, supprimez la première ligne for et supprimez la skip=1 (qui ignore la première ligne) de la seconde.

Le problème fondamental est que batch traite une chaîne de délimiteurs comme un seul délimiteur, il est donc nécessaire de séparer ces délimiteurs. Ceci n'est pas possible par rapport à un metavariable, mais peut être effectué dans une boucle en transférant le metavariable dans une variable d'environnement ordinaire (line) et en effectuant la cérémonie de remplacement de chaîne sur cette variable ordinaire en mode delayed expansion. Remplacez chaque , par |,, puis traitez la chaîne résultante en utilisant | comme délimiteur. Notez que le metavariable est dans un cas différent pour le second for - l'une des rares occasions où cmd est sensible à la casse. Reconstruire la chaîne, en omettant la colonne 7 (%% G) et en utilisant le jeton * signifiant que le huitième jeton (%% H) reçoit le reste de la ligne après le numéro de jeton le plus explicitement mentionné (7) et echo après avoir supprimé le reste | caractères. Notez qu'il est normal que vous refusiez les demandes de code sur le SO et que vous répondiez de manière à corriger le code défectueux. Dans ce cas, cependant, les navigateurs suivants peuvent trouver cette réponse comme la clé pour effectuer une tâche similaire et donc s'abstenir de poster inutilement. De plus, je m'ennuie sans esprit.