Windows Lot de lire le fichier et d'analyser des lignes en jetons, et les variables
J'ai fait beaucoup de progrès par la recherche de ce site et de l'apprentissage du ridicule langage de commandes Windows scripting, mais je suis maintenant à un point où je suis bloqué. J'ai un fichier texte avec un nombre variable de lignes, chaque de ce qui ressemble à quelque chose comme:
AA8315,"United States",N777AN,"American Airlines",AAL98,B772,"Boeing 777-223",AAL,"2013-06-11 23:30:47.923","2013-06-12 00:01:14.459"
Mon fichier de commandes:
set THEDATE=2013-06-12
set THEDATABASE=c:\Kinetic\BaseStation\Basestation.sqb
set THECSVFILE=c:\Flights.csv
set THEOUTPUTFILE=c:\FlightsNew.csv
set THISLINE=""
if exist %THECSVFILE% del %THECSVFILE%
if exist %THEOUTPUTFILE% del %THEOUTPUTFILE%
:: allow time for the csv file to be deleted
timeout /t 2 /nobreak
c:\sqlite3.exe -header -csv %THEDATABASE% "select Aircraft.ModeS, Aircraft.ModeSCountry as Country, Aircraft.Registration as Reg, Aircraft.RegisteredOwners as Owner, Flights.Callsign, Aircraft.ICAOTypeCode as Type, Aircraft.Type as Model, Aircraft.OperatorFlagCode as 'Op Flag', Flights.StartTime as 'First Seen', Flights.EndTime as 'Last Seen' from Aircraft INNER JOIN Flights ON (Aircraft.AircraftID=Flights.AircraftID) where Flights.EndTime like '%THEDATE% %%' order by Flights.EndTime DESC;" >> %THECSVFILE%
::allow time for the csv to be written to file
timeout /t 5 /nobreak
::read %THECSVFILE% and loop through each line
for /F "usebackq tokens=* delims=" %%A in (%THECSVFILE%) do (
set the_line=%%A
call :process_line
)
:process_line
for /F "usebackq tokens=1,2,3,4,5,6,7,8,9,10 delims=[,]" %%1 in (%the_line%) do (
set hexcode=%%1
set country=%%2
set reg=%%3
set owner=%%4
set callsign=%%5
set planetype=%%6
set model=%%7
set opflag=%%8
set firstseen=%%9
set lastseen=%%10
set THISLINE=%hexcode%,%country%,%reg%,%owner%,%callsign%,%planetype%,%model%,%opflag%,%firstseen%,%lastseen%
echo %THISLINE% > %THEOUTPUTFILE%
)
(Je suis à l'attribution de jetons de variables, car je vais faire des supplémentaires de validation et de mise en forme plus tard. J'ai besoin d'obtenir cette partie de travail d'abord!)
Lors de l'exécution, le script n'est en effet en boucle sur chaque ligne du fichier, mais il ne semble pas être l'attribution %%1
à la variable hexcode
.
La sortie de la commande exécutée ressemble à ceci:
C:\>for /F "usebackq tokens=1,2,3,4,5,6,7,8,9,10 delims=[,]" %1 in (AA8315 "United States" N777AN "American Airlines" AAL98 B772 "Boeing 777-223" AAL "2013-06-11 23:30:47.923" "2013-06-12 00:01:14.459") do (
set hexcode=%1
set country=%2
set reg=%3
set owner=%4
set callsign=%5
set planetype=%6
set model=%7
set opflag=%8
set firstseen=%9
set lastseen=%10
set THISLINE=,"United States" ,N807FD ,"Fedex Express" ,FDX1378 ,,"Airbus A310-324" ,FDX ,"2013-06-12 22:56:54.639" ,"2013-06-12 23:05:31.822"
echo "" 1>c:\FlightsNew.csv
)
The system cannot find the file AA8315.
Toute aide est grandement appréciée!
CEPENDANT, je crois que tu serais mieux de passer la totalité de la ligne en tant que paramètre à la procédure, alors la construction de votre variables à partir de %1..%9 avec
SHIFT
de manière conventionnelle. De cette façon, les noms de pays comme le Congo, la République Démocratique du" sont traitées comme une seule chaîne. Essayez en entrant une virgule entre "Royaume" et "États" dans votre fichier de données et vous verrez la différence.OriginalL'auteur SonicGoose | 2013-07-03
Vous devez vous connecter pour publier un commentaire.
J'ai toujours eu des problèmes avec des valeurs séparées par des virgules dans un
for
boucle. Voici ce que j'ai fait pour rendre votre code de travail.Test.txt
Fichier batch.chauve-souris
Avis de la :process_line
for
boucle. J'ai dû ajouter des guillemets simples autour de la%the_line%
de sorte qu'il n'essayez pas d'interpréter la chaîne comme un nom de fichier. Puis j'ai remplacé toutes les virgules par le symbole~, et a utilisé le caractère ~ comme délimiteur. Il peut ne pas fonctionner en synergie avec l'ensemble de vos données (si elle contient des guillemets simples ou le caractère~), mais il ne fonctionne pas avec cet enregistrement et vous permet de vous déplacer dans la bonne direction.Cela, évidemment, ne peut pas fonctionner. Il y a donc beaucoup d'erreurs, j'ai arrêté de compter :-), et la sortie est
echo is OFF
.Il ne fonctionne pas. Regardez la valeur dans le fichier de sortie du dernier élément,
lastseen
- vous verrez que c'est la même que la première,hexcode
avec un ajouté0
en Outre, le travail, la parenthèse fermante de laDO
dans:process_line
devrait être après laset lastseen
- sinon, les valeurs présentées seront les valeurs de AVANT tahtfor/f
a été exécuté peut - être le obsolètes les valeurs de la dernière exécution. De plus, le>
aurait besoin d'être>>
pour ajouter de nouvelles données ligne par ligne.Pour se qualifier, cela fonctionne lorsque les variables sont modifiées pour des lettres plutôt que des chiffres ET la dernière ligne est modifié pour se lire
echo %THISLINE% >> %THEOUTPUTFILE%
(avec deux >).C'était ma première pensée, mais étonnamment, à l'aide de
%%1
thru%%10
fonctionne très bien. Je ne suis pas sûr de ce qu'il était à propos de la virgule, ils ont toujours été problématique pour moi. Au lieu de creuser profondément pour savoir pourquoi, j'ai toujours juste remplacé avec~
et utilisé comme délimiteur, qui a toujours été efficace. Peut-être un jour, quand j'ai du temps libre, je vais essayer de découvrir pourquoi...OriginalL'auteur James L.
cela fonctionne ici:
Je ne suis pas sûr, pourquoi avez-vous besoin des jetons.
excusez-moi s'il vous plaît, I*m genre de troubles mentaux et ne peut pas lire de longs textes.
OriginalL'auteur Endoro
Vous ne pouvez utiliser des lettres pour le metavariable (
%%1
dans votre code) - mais les minuscules et majuscules sont distincts.Oui, vous pouvez utiliser d'autres personnages, mais les blocs contigus disponible pour
"tokens=1-10"
(qui est une version plus facile de 1,2,3...) sont a..z et A..Z%0..%9 sont réservés pour les paramètres pour le lot ou lot de fabrication de la procédure.
for
boucle.Beaux - allez-y alors...
Pas de soucis. Il vient comme une surprise totale pour moi. Appris tout à l'heure lors de la tentative de son code...
J'ai essayé d'utiliser des lettres au lieu de chiffres (%%au lieu de %%1 et %~au lieu de %~1) et encore obtenir le même résultat. "Le système ne peut pas trouver le fichier AA8315."
J'ai dû changer à l'aide de lettres, de chiffres. Nombre %%1 à %%9 travaillé, mais $10$ont été lus comme %%1 par un 0 sur la fin. %à %travers %%j fonctionne très bien maintenant avec le code modifié fournie par James.
OriginalL'auteur Magoo