PDA

View Full Version : Help per script o batch


TNOTB
03-10-2008, 16:52
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:)

TNOTB
05-10-2008, 17:20
Nessuno può aiutarmi?

wizard1993
05-10-2008, 19:09
in batch no; in un qualsiasi linguaggio ad alto livello è più semplice; ha conoscenze di qualche tipo?

TNOTB
06-10-2008, 10:31
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

vladix
06-10-2008, 11:35
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

TNOTB
06-10-2008, 12:00
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

vladix
06-10-2008, 12:35
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%

vladix
06-10-2008, 12:35
mi sembra di capire che vengono divise le righe dopo le due cifre dopo il punto
nn e quello che volevi ?

TNOTB
06-10-2008, 12:52
si certo, ma il file rimane il medesimo... non ci sono cambiamenti
grazie:)

vladix
06-10-2008, 12:56
: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

TNOTB
06-10-2008, 13:04
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"

vladix
06-10-2008, 13:41
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%

TNOTB
06-10-2008, 14:32
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:)

vladix
06-10-2008, 16:58
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

TNOTB
06-10-2008, 17:21
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

TNOTB
07-10-2008, 10:19
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:

vladix
07-10-2008, 12:05
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 ,

TNOTB
07-10-2008, 12:40
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

vladix
07-10-2008, 13:15
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

TNOTB
07-10-2008, 15:14
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:

vladix
07-10-2008, 15:19
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

TNOTB
07-10-2008, 17:06
: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:)

vladix
07-10-2008, 17:48
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

TNOTB
08-10-2008, 10:11
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:)

TNOTB
08-10-2008, 15:39
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

TNOTB
09-10-2008, 09:28
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:)

vladix
09-10-2008, 10:13
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

TNOTB
09-10-2008, 10:36
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

TNOTB
10-10-2008, 11:43
Ottimo, funziona tutto alla perfezione!!!

Grazie di tutto:)