View Full Version : Help per script o batch
Ciao a tutti:)
avrei bisogno di un programmino o un semplice batch che mi automatizzi una certa operazione relativa al contenuto di un file
premetto che sono a digiuno di qualsiasi linguaggio di programmazione e/o di comandi avanzati per creare script o batch, e che tale cosa non mi serve per corsi o studi.
Mi spiego:
ho un file con questo contenuto tipo:
L 101 1
CU Z 2449028.834523083.52 184.54
CD Z 2449029.244523084.09 184.45
CD Z 2449031.914523082.27 184.34
CD Z 2449051.484523061.27 184.49
CD Z 2449050.404523060.48 184.74
CD Z 2449029.444523083.90 184.37
L 101 2
CU Z 2449028.794523083.54 184.51
CD Z 2449051.434523061.41 184.50
L 101 3
CU Z 2449051.434523061.41 184.50
L 101 4
CU Z 2449028.524523130.61 178.31
CD Z 2449034.174523128.20 178.24
CD Z 2449033.304523125.85 178.25
CD Z 2449027.544523128.00 178.20
CD Z 2449028.504523130.57 178.27
CD Z 2449033.064523125.85 178.23
tali codici dovrebbero essere trasformati così:
- le righe relative a "L 101 1 " devono sparire
- ogni codice "CU Z" e "CD Z" deve essere sostituito con CTB
- ogni valore numerico di ogni riga, ad esempio:
2449028.834523083.52 184.54
deve essere così scomposto
2449028.83 4523083.52 184.540
ovvero la serie centrale deve essere separata due cifre dopo il punto
- all'inizio di ogni riga, dopo il codice CTB (ex CU Z/CD Z) deve essere inserito il corrispondente valore numerico della riga alla quale appartiene la serie di codici
nell'esempio sopra abbiamo 4 serie di codici e nella prima ad esempio abbiamo 6 righe
in definititiva il prodotto del file deve essere come segue, rispettando gli spazi tra i vari valori:
CTB 1 2449028.83 4523083.52 184.540
CTB 2 2449029.24 4523084.09 184.450
CTB 3 2449031.91 4523082.27 184.340
CTB 4 2449051.48 4523061.27 184.490
CTB 5 2449050.40 4523060.48 184.740
CTB 6 2449029.44 4523083.90 184.370
CTB 1 2449028.79 4523083.54 184.510
CTB 2 2449051.43 4523061.41 184.500
CTB 1 2449028.52 4523130.61 178.310
CTB 2 2449034.17 4523128.20 178.240
CTB 3 2449033.30 4523125.85 178.250
CTB 4 2449027.54 4523128.00 178.200
CTB 5 2449028.50 4523130.57 178.270
CTB 6 2449033.06 4523125.85 178.230
CTB 1 2449082.66 4523117.36 180.470
CTB 2 2449080.33 4523117.16 180.250
CTB 3 2449080.28 4523119.32 180.250
CTB 4 2449080.75 4523119.44 180.250
CTB 5 2449080.62 4523120.27 180.250
CTB 6 2449082.84 4523120.31 180.210
CTB 7 2449085.51 4523120.02 180.130
CTB 8 2449085.28 4523117.25 180.420
esiste la possibilità di creare un batch che si occupi di tal operazione? sono circa 13000 righe e sarebbe un lavoraccio da fare manualmente.
Grazie:)
wizard1993
05-10-2008, 19:09
in batch no; in un qualsiasi linguaggio ad alto livello è più semplice; ha conoscenze di qualche tipo?
in batch no; in un qualsiasi linguaggio ad alto livello è più semplice; ha conoscenze di qualche tipo?
purtroppo non ho conoscenze di alcun tipo di linguaggio
e possibile farlo anche da dos ( ma ci dovrai lavorare un po su)
puoi partire da questo
@echo off
for /F "tokens=*" %%i IN (test.txt) do call :sp "%%i"
:sp
set lol=%1
echo %lol:~1,20% %lol:~21%
dove test.txt e il tuo file con quei dati ,
l'ultima riga sn sottostringhe di una riga del file ( una riga viene divisa in 2 e viene aggiunto tre spazi vuoti :O , se nn ti e chiaro cm creare le sottostringhe :
%stringaDaDividere:~indiceInizio,indiceFIne% e ti ritorna lastringa tra i 2 indici AUGURI :D
ho provato creando un batch con le tue righe ma il file non viene modificato
al prompt è visualizzata l'operazione (mi sembra di capire che vengono divise le righe dopo le due cifre dopo il punto) ma non ho output
bsta aggiungere ">> fileStampa.txt" ( che sia un file diverso da quello vecchio !!! )
@echo off
for /F "tokens=*" %%i IN (test.txt) do call :sp "%%i" >> lol.txt
:sp
set lol=%1
set xd=%lol:~1,20% %lol:~21%
set xd=%xd:"= %
echo %xd%
mi sembra di capire che vengono divise le righe dopo le due cifre dopo il punto
nn e quello che volevi ?
si certo, ma il file rimane il medesimo... non ci sono cambiamenti
grazie:)
:eek: certo che il file nn viene modificato , io ne creo un altor , forse dovresti guardare il file "lol.txt" che lo crei qui
for /F "tokens=*" %%i IN (test.txt) do call :sp "%%i" >> lol.txt
caxx funziona.... solo che alla fine di ogni riga mi compaiono le virgolette "
L 101 1 "
CU Z 2449028.83 4523083.52 184.54"
CD Z 2449029.24 4523084.09 184.45"
CD Z 2449031.91 4523082.27 184.34"
CD Z 2449051.48 4523061.27 184.49"
CD Z 2449050.40 4523060.48 184.74"
CD Z 2449029.44 4523083.90 184.37"
L 101 2 "
CU Z 2449028.79 4523083.54 184.51"
CD Z 2449051.43 4523061.41 184.50"
usa il secondo script che ho postato , quello toglie le virgolette
@echo off
for /F "tokens=*" %%i IN (test.txt) do call :sp "%%i" >> lol.txt
:sp
set lol=%1
set xd=%lol:~1,20% %lol:~21%
set xd=%xd:"= %
echo %xd%
Ok, grazie per la disponibilità:)
scusa se approfitto e perdona l'ignoranza, ma mi chiariresti il significato di ogni riga/comando?
mica hai per caso qualche soluzione anche per le altre cose richieste?
scusa ancora se approfitto e grazie:)
li faccio solo operazioni su stringhe , e molto semplice ,guardati questi link x i flag (http://www.computerhope.com/dirhlp.htm), le operazioni su stringhe (http://www.dostips.com/DtTipsStringManipulation.php) , il ciclo for (http://jamesewelch.wordpress.com/2008/05/01/how-to-write-a-dos-batch-file-to-loop-through-files/)
@echo off
for /F "tokens=*" %%i IN (test.txt) do call :sp "%%i" >> lol.txt
rem itera tra le righe del file test.txt -> chiama il label :sp e appende su lol.txt l'echo ( alla fine del label )
:sp
set lol=%1
set riga=%lol:~1,1%
rem se la riga inizia x L nn la aggiungo al nuovo file
if '%riga%' == 'L' goto skip
set xd=%lol:~1,4% 1%lol:~5,16% %lol:~21%
set xd=%xd:CU Z=CTB %
set xd=%xd:CD Z=CTB %
set xd=%xd:"= %
echo %xd%
:skip
come vedi basta un po di fantasia :O
li faccio solo operazioni su stringhe , e molto semplice ,guardati questi link x i flag (http://www.computerhope.com/dirhlp.htm), le operazioni su stringhe (http://www.dostips.com/DtTipsStringManipulation.php) , il ciclo for (http://jamesewelch.wordpress.com/2008/05/01/how-to-write-a-dos-batch-file-to-loop-through-files/)
@echo off
for /F "tokens=*" %%i IN (test.txt) do call :sp "%%i" >> lol.txt
rem itera tra le righe del file test.txt -> chiama il label :sp e appende su lol.txt l'echo ( alla fine del label )
:sp
set lol=%1
set riga=%lol:~1,1%
rem se la riga inizia x L nn la aggiungo al nuovo file
if '%riga%' == 'L' goto skip
set xd=%lol:~1,4% 1%lol:~5,16% %lol:~21%
set xd=%xd:CU Z=CTB %
set xd=%xd:CD Z=CTB %
set xd=%xd:"= %
echo %xd%
:skip
come vedi basta un po di fantasia :O
Grazie 1000, stasera mi studio i link;):)
buona serata
Ho dato un'occhiata ai link... ma non ho trovato nulla che potesse contare le righe tra ogni serie ed anteporre dopo il "CTB" il progressivo della riga:muro:
ma non ho trovato nulla che potesse contare le righe tra ogni serie
nn ho capito cosa intendi , se x serie intendi le prime lettere della riga basterebbe fare un confronto tra le prime lettere "%lol:~1,4%" e il tipo di "serie" "CU Z" , e incrementare il progresivo di "questa" serie
x contare le righe basta aggiungere un altra variabile che la incrementi ad ogni passaggio del ciclo
set /A index+=1
....
set xd=%lol:~1,4% %index%%lol:~5,16% %lol:~21%
Ho dato un'occhiata ai link... ma non ho trovato nulla
beh nn e che spiegano il tuo caso specifico , ma secondo me c'e tutto quello che basta ,
nn ho capito cosa intendi , se x serie intendi le prime lettere della riga basterebbe fare un confronto tra le prime lettere "%lol:~1,4%" e il tipo di "serie" "CU Z" , e incrementare il progresivo di "questa" serie
x contare le righe basta aggiungere un altra variabile che la incrementi ad ogni passaggio del ciclo
set /A index+=1
....
set xd=%lol:~1,4% %index%%lol:~5,16% %lol:~21%
beh nn e che spiegano il tuo caso specifico , ma secondo me c'e tutto quello che basta ,
per serie intendo le righe contenute tra le varie "L 101 1..."
L 101 1
CU Z 2449028.834523083.52 184.54
CD Z 2449029.244523084.09 184.45
CD Z 2449031.914523082.27 184.34
CD Z 2449051.484523061.27 184.49
CD Z 2449050.404523060.48 184.74
CD Z 2449029.444523083.90 184.37
L 101 2
CU Z 2449028.794523083.54 184.51
CD Z 2449051.434523061.41 184.50
L 101 3
fai cosi
fai l'incremento della variabile index dopo il controllo se la riga e L 101
if '%riga%' == 'L' goto skip
set /A index+=1
se la riga nn e L101 il programma continua e incrementa la variabile di 1 ee stampa il valore su file , altrimenti va al label :sxip e risetti la variabile index , in modo che alla prox iterazione ricomincia da 0 :)
:skip
set index=0
ovviamente a questo punto il label :skip nn puo + essere l'ultima riga del file xche ti risseterebbe l'index ad ogni iterazione
uhm..sarà che non ci capisco una mazza... ma non riesco ad andare oltre questo risultato
CTB 1 2449028.83 4523083.52 184.54
CTB 1 2449029.24 4523084.09 184.45
CTB 1 2449031.91 4523082.27 184.34
CTB 1 2449051.48 4523061.27 184.49
CTB 1 2449050.40 4523060.48 184.74
CTB 1 2449029.44 4523083.90 184.37
CTB 1 2449028.79 4523083.54 184.51
CTB 1 2449051.43 4523061.41 184.50
CTB 1 2449051.43 4523061.41 184.50
CTB 1 2449028.52 4523130.61 178.31
CTB 1 2449034.17 4523128.20 178.24
CTB 1 2449033.30 4523125.85 178.25
CTB 1 2449027.54 4523128.00 178.20
utilizzando questo script
@echo off
for /F "tokens=*" %%i IN (TS01.txt) do call :sp "%%i" >> lol.txt
rem
:sp
set lol=%1
set riga=%lol:~1,1%
rem
if '%riga%' == 'L' goto skip
set /A index+=1
set xd=%lol:~1,4% 1%lol:~5,16% %lol:~21%
set xd=%xd:CU Z=CTB %
set xd=%xd:CD Z=CTB %
set xd=%xd:"= %
echo %xd%
:skip
set index=0
non riesco ad avere questo tipo di output
CTB 1 2449028.83 4523083.52 184.540
CTB 2 2449029.24 4523084.09 184.450
CTB 3 2449031.91 4523082.27 184.340
CTB 4 2449051.48 4523061.27 184.490
CTB 5 2449050.40 4523060.48 184.740
CTB 6 2449029.44 4523083.90 184.370
CTB 1 2449028.79 4523083.54 184.510
CTB 2 2449051.43 4523061.41 184.500
CTB 1 2449028.52 4523130.61 178.310
CTB 2 2449034.17 4523128.20 178.240
CTB 3 2449033.30 4523125.85 178.250
CTB 4 2449027.54 4523128.00 178.200
CTB 5 2449028.50 4523130.57 178.270
CTB 6 2449033.06 4523125.85 178.230
Ovvero a numerare le righe contenute tra le L 101
che debba prima contare le righe e poi eliminare le L101?:muro:
xche il label skip nn puo essere l'ultima istruzione del file ( xche risetti index a 0 ad ogni iterazione 0 )
@echo off
for /F "tokens=*" %%i IN (test.txt) do call :sp "%%i" >> lol.txt
goto end
:skip
set index=0
goto end
:sp
set /a index+=1
set lol=%1
set riga=%lol:~1,1%
if '%riga%' == 'L' goto skip
set xd=%lol:~1,4% %index%%lol:~5,16% %lol:~21%
set xd=%xd:CU Z=CTB %
set xd=%xd:CD Z=CTB %
set xd=%xd:"= %
echo %xd%
:end
:eek:strepitoso!! funge alla perfezione...
mi sto informando nei link che hai postato su come allineare il testo, difatti non vengono allineate le righe con i contatori a 2 e 1 cifra
CTB 8 2449048.14 4523134.70 182.13
CTB 9 2449042.74 4523122.30 179.11
CTB 10 2449037.50 4523124.50 179.18
CTB 11 2449041.24 4523133.55 181.89
cmq....un immenso grazie, a buon rendere:)
mi sto informando nei link che hai postato su come allineare il testo, difatti non vengono allineate le righe con i contatori a 2 e 1 cifra
ci 6 riuscito ? :asd: , cmq ci sono diversi modi x farlo , il + semplice che mi viene in mente e creare un altra variabile e aggiungi il valore del index + un po di spazi ,
set formatedIndex=%index% <- ci sn 3 spazi vuoti
dopo di che sulla riga stampi una sotto stringa della nuova variabile
set xd=%lol:~1,4% %formatedIndex:~0,4%%lol:~5,16% %lol:~21%
che sarebbe la stringa comresa tra l'indice 0 e 4 , quindi un numero fino a 9999 risulterebbe alineato :D
@echo off
for /F "tokens=*" %%i IN (test.txt) do call :sp "%%i" >> lol.txt
goto end
:skip
set index=0
goto end
:sp
set /a index+=1
set lol=%1
set riga=%lol:~1,1%
if '%riga%' == 'L' goto skip
set formatedIndex=%index%
set xd=%lol:~1,4% %formatedIndex:~0,4%%lol:~5,16% %lol:~21%
set xd=%xd:CU Z=CTB %
set xd=%xd:CD Z=CTB %
set xd=%xd:"= %
echo %xd%
:end
ci 6 riuscito ? :asd: , cmq ci sono diversi modi x farlo , il + semplice che mi viene in mente e creare un altra variabile e aggiungi il valore del index + un po di spazi ,
set formatedIndex=%index% <- ci sn 3 spazi vuoti
dopo di che sulla riga stampi una sotto stringa della nuova variabile
set xd=%lol:~1,4% %formatedIndex:~0,4%%lol:~5,16% %lol:~21%
che sarebbe la stringa comresa tra l'indice 0 e 4 , quindi un numero fino a 9999 risulterebbe alineato :D
@echo off
for /F "tokens=*" %%i IN (test.txt) do call :sp "%%i" >> lol.txt
goto end
:skip
set index=0
goto end
:sp
set /a index+=1
set lol=%1
set riga=%lol:~1,1%
if '%riga%' == 'L' goto skip
set formatedIndex=%index%
set xd=%lol:~1,4% %formatedIndex:~0,4%%lol:~5,16% %lol:~21%
set xd=%xd:CU Z=CTB %
set xd=%xd:CD Z=CTB %
set xd=%xd:"= %
echo %xd%
:end
scherzi?!.... è ovvio
che non ci son riuscito :D:D
cmq è un casino, se non hai buone basi è complicata la cosa....
ora provo con l'ultima;)
grazie:)
Funge....cifre allineate ma diversamente da quanto detto prima devono essere allineate così:
CTB 7 2449034.62 4523140.19 182.47
CTB 8 2449048.14 4523134.70 182.13
CTB 9 2449042.74 4523122.30 179.11
CTB 10 2449037.50 4523124.50 179.18
CTB 11 2449041.24 4523133.55 181.89
CTB 12 2449039.16 4523134.49 179.96
CTB 13 2449036.95 4523129.30 180.17
faccio qualche prova... speriamo bene
Funge....cifre allineate ma diversamente da quanto detto prima devono essere allineate così:
CTB 7 2449034.62 4523140.19 182.47
CTB 8 2449048.14 4523134.70 182.13
CTB 9 2449042.74 4523122.30 179.11
CTB 10 2449037.50 4523124.50 179.18
CTB 11 2449041.24 4523133.55 181.89
CTB 12 2449039.16 4523134.49 179.96
CTB 13 2449036.95 4523129.30 180.17
faccio qualche prova... speriamo bene
Ho provato ad aggiungere o eliminare spazi a questa riga set formatedIndex=%index% e cambiare valori qui set xd=%lol:~1,4% %formatedIndex:~0,4%%lol:~5,16% %lol:~21% ma nulla...non riesco a capire il funzionamento/gestione dell'index:muro: :cry:
risci a darmi una mano? questa dovrebbe esserre l'ultima, grazie:)
aggiungi i spazi avanti alla variabile index
set formatedIndex= %index%
e poi ti prendi la sottostringa iniziando dalla fine della stringa verso l'inizio mettendo il "-" avanti al indice , cioe se tu hai una stringa "012345" l'istruzione %stringa:~-2% visualizera "45" , eliminando i caratteri in + :D
@echo off
for /F "tokens=*" %%i IN (test.txt) do call :sp "%%i" >> lol.txt
goto end
:skip
set index=0
goto end
:sp
set /a index+=1
set lol=%1
set riga=%lol:~1,1%
if '%riga%' == 'L' goto skip
set formatedIndex= %index%
set xd=%lol:~1,4% %formatedIndex:~-4%%lol:~5,16% %lol:~21%
set xd=%xd:CU Z=CTB %
set xd=%xd:CD Z=CTB %
set xd=%xd:"= %
echo %xd%
:end
aggiungi i spazi avanti alla variabile index
set formatedIndex= %index%
e poi ti prendi la sottostringa iniziando dalla fine della stringa verso l'inizio mettendo il "-" avanti al indice , cioe se tu hai una stringa "012345" l'istruzione %stringa:~-2% visualizera "45" , eliminando i caratteri in + :D
@echo off
for /F "tokens=*" %%i IN (test.txt) do call :sp "%%i" >> lol.txt
goto end
:skip
set index=0
goto end
:sp
set /a index+=1
set lol=%1
set riga=%lol:~1,1%
if '%riga%' == 'L' goto skip
set formatedIndex= %index%
set xd=%lol:~1,4% %formatedIndex:~-4%%lol:~5,16% %lol:~21%
set xd=%xd:CU Z=CTB %
set xd=%xd:CD Z=CTB %
set xd=%xd:"= %
echo %xd%
:end
hihi ....l'unica che ho indovinato nelle mie prove è questa
set formatedIndex= %index%
anche al "-" ci ero arrivato ma mi son perso tra le stringhe e sottostringhe :D
provo questa
ri-thanks
Ottimo, funziona tutto alla perfezione!!!
Grazie di tutto:)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.