Ir ao conteúdo

Bat Alterar arquivos com bat


Ir à solução Resolvido por ricardo_br,

Posts recomendados

Postado

Olá, algum tempo atrás pedi ajuda para renomear arquivos a partir de uma lista. Agora preciso fazer alterações dentro destes arquivos(alguns arquivos preciso somente reorganizar as linhas seguindo uma lógica, outros preciso verificar o nome e inserir as linhas de um arquivo no outro(podemos testar isto com os arquivos do anexo!, outros preciso escrever algo na linha - Acredito que solucionando a reorganização consigo finalizar o restante).
Vamos a primeira questão:
O código que fiz para reorganizar as linhas funciona(apesar de aparecer a mensagem "Atingido o nível máximo de recursão local.") mas não sei como fazer para ele identificar todos os arquivos da pasta e fazer essa organização para todos eles (o ideal seria executar essa reorganização junto ou logo após renomear os arquivos.)
 

Código para Renomear os arquivos(os arquivos a serem renomeados e o arquivo de lista estão na mesma pasta):

@echo off

set Lista=Listadenomes.txt

for /f "tokens=1,2 usebackq" %%a in ("%Lista%") do if /i exist "%%a" ren "%%a" "%%b.tmp"
exit


Código para Organizar as linhas dentro dos arquivos(Este código que não sei como fazer para identificar todos os arquivos .tmp na pasta e reorganizar salvando em .txt.
Obs: Cada linha é um numero, não necessariamente sequencial, por isso usei os loops para organizar da forma como preciso.
Obs2: Em alguns casos pode ter o caractere "&" antes do número (também é um problema, pois ¨&¨ some juntamente com o que estiver após - pelo que pesquisei/entendi ele faz parte de comandos bat)

@echo off
SETLOCAL DisableDelayedExpansion

SET count=1
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ %userprofile%\desktop\Exemplos\NOME1LOTEMESANO.tmp"`) do (    
set "var=%%a"
SETLOCAL ENABLEDELAYEDEXPANSION
set "var=!var:*:=!"
set "var!count!=!var!"
SET /a count=!count!+1
)

set countloopb=0
:loopb
set /a countloopb=%countloopb%+1

set countloopa=0
SET /a count=%countloopb%
:loopa
set /a countloopa=%countloopa%+1

set "requisicao=var!count!"
set /a "requisicao=!requisicao!"
set /a count=%count%+12

if %requisicao%==0 echo(%/n% >> NOME1LOTEMESANO.txt
if %requisicao% neq 0 echo(!requisicao! >> NOME1LOTEMESANO.txt

if %countloopa% neq 8 goto loopa

if %countloopb% neq 12 goto loopb
pause
exit


Estou usando como artificio renomear para um arquivo .tmp no primeiro .bat e depois para o .txt no segundo .bat. Mas poderia ser 1 bat só para fazer tudo(não preciso do arquivo .tmp).
Anexo os arquivos de exemplo(necessário retirar ".txt" dos arquivos "Arquivo.W01" e "Arquivo.W02").
Ao executar o primeiro .bat vão ser gerados os arquivos para o segundo .bat (somente para o "Arquivo.W01").
OBS: Caso tenha linhas em branco, pelo menos hoje eu preciso manter em branco(sem nada), mas depois eu vou precisar apagar somente as que estão no final do arquivo após a reorganização.

Listadenomes.txt Arquivo.W01.txt Arquivo.W02.txt

Postado

Esses números se referem a uma matriz com 96 posições, sendo 8(de A a F) linhas e 12(de 1 a 12) colunas. O arquivo está escrito de A1 a A12,B1 a B12 e assim por diante(em linhas). Preciso escrever de A1 a F1, B2 a B12 e assim por diante(em colunas):
 

Como está	Como Preciso
1	1
9	2
17	3
25	4
33	5
41	6
49	7
57	8
65	9
73	10
81	11
89	12
2	13
10	14
18	15
26	16
34	17
42	18
50	19
58	20
66	21
74	22
82	23
90	24
3	25
11	26
19	27
27	28
35	29
43	30
51	31
59	32
67	33
75	34
83	35
91	36
4	37
12	38
20	39
28	40
36	41
44	42
52	43
60	44
68	45
76	46
84	47
92	48
5	49
13	50
21	51
29	52
37	53
45	54
53	55
61	56
69	57
77	58
85	59
93	60
6	61
14	62
22	63
30	64
38	65
46	66
54	67
62	68
70	69
78	70
86	71
94	72
7	73
15	74
23	75
31	76
39	77
47	78
55	79
63	80
71	81
79	82
87	83
95	84
8	85
16	86
24	87
32	88
40	89
48	90
56	91
64	92
72	93
80	94
88	95
96	96

Mas pode acontecer de alguma posição não ser preenchida, então fica uma linha em branco naquela posição(eu preciso mantê-la em branco - a menos que não tenha nenhum numero após quando eu faço a conversão) 
 

Postado

No exemplo você simplesmente fez um listagem sequencial e você diz que se tiver uma linha em branco, no caso se tiver algo na próxima linha está não devera ser mexida o resultado esperado seria esse então se a 6 linha tiver em branco?


 

1     1
9     2
17    3
25    4
33    5

49    7
57    8
65    9
73    10

 

 

 

Postado
1	1
9	2
17	3
25	4
	5
41	6
49	7
57	8
65	9
73	10
81	11
	12
2	13
10	14
18	15
26	16
34	17
42	18
50	19
58	20
66	21
74	22
82	23
	24
3	25
11	26
19	27
27	28
35	29
43	30
51	31
59	32
67	
75	34
83	35
	36
4	37
12	38
20	39
28	40
36	41
44	42
52	43
60	44
68	45
76	46
84	47
	48
5	49
13	50
21	51
29	52
37	53
45	54
53	55
61	56
69	57
77	58
85	59
	60
6	61
14	62
22	63
30	64
38	65
46	66
54	67
62	68
70	69
78	70
86	71
	72
7	73
15	74
23	75
31	76
39	77
47	78
55	79
63	80
71	81
79	82
87	83
	84
8	85
16	86
24	87
32	88
40	
48	
56	
64	
72	
80	
88	
	

A linha em branco seria reorganizada junto com as outras, eu não posso suprimir ela (por exemplo o nº 33 - estaria entre 25 e 31 na coluna da esquerda) já os números de 89 a 96(coluna da esquerda), como na organização(coluna da direita) não tem nenhum outro numero após, eu posso apagar(não preciso da linha em branco)

Postado

@ricardo_br usei as colunas só como demonstração de como é, e como preciso. 
O que eu tenho é isso:
 

	1	2	3	4	5	6	7	8	9	10	11	12
A	1	9	17	25	33	41	49	57	65	73	81	89
B	2	10	18	26	34	42	50	58	66	74	82	90
C	3	11	19	27	35	43	51	59	67	75	83	91
D	4	12	20	28	36	44	52	60	68	76	84	92
E	5	13	21	29	37	45	53	61	69	77	85	93
F	6	14	22	30	38	46	54	62	70	78	86	94
G	7	15	23	31	39	47	55	63	71	79	87	95
H	8	16	24	32	40	48	56	64	72	80	88	96

No arquivo de texto está escrito em linhas, e eu preciso 'converter' para colunas. No arquivo de exemplo que coloquei está escrito assim:
 

1
9
17
25
33
41
49
57
65
73
81
89
2
10
...

eu quero ler esse arquivo e organizar assim:
 

1
2
3
4
5
6
7
8
9
10
11
12
13

 

Postado

Veja se é isso:

 

@echo off
SetLocal EnableDelayedExpansion

:: Arraste a pasta onde estão os arquivos para o batch
:: Informe aqui o arquivo com a lista de nomes:
set "Lista=Listadenomes.txt"

if exist "%~1" (if not exist "%~1\" exit) else (exit)

set "Pasta=%~1"
pushd "%Pasta%"

for /f "tokens=1,2 usebackq" %%a in ("%Lista%") do if /i exist "%%a" ren "%%a" "%%b.txt"

for /f "delims=" %%a in ('dir /b *.txt ^|find /i /v "%Lista%"') do call :ReOrganizar "%%~a"
popd
exit

:ReOrganizar
set Contador=
for /f "tokens=1* Delims=]" %%a in ('type "%~1" ^|find /i /n /v ""') do (
                                                                         set /a Contador+=1
                                                                         >>"%~1.tmp" echo !Contador!
                                                                        )
IF exist "%~1.tmp" (
                    del /q "%~1" 
                    ren "%~1.tmp" "%~1"
                   )
goto :EOF

 

c4eTEg3.gif

 

Postado

Se sua intenção é criar uma tabela assim em batch veja esse exemplo:

 

bdjPdwb.png

 

@echo off
SetLocal EnableDelayedExpansion

set Tabela=Tabela.csv

set LinhaA=A
set LinhaB=B
set LinhaC=C
set LinhaD=D
set LinhaE=E
set LinhaF=F
set LinhaG=G
set LinhaH=H

call :CriarTabela
>>"%Tabela%" echo %LinhaA%
>>"%Tabela%" echo %LinhaB%
>>"%Tabela%" echo %LinhaC%
>>"%Tabela%" echo %LinhaD%
>>"%Tabela%" echo %LinhaE%
>>"%Tabela%" echo %LinhaF%
>>"%Tabela%" echo %LinhaG%
>>"%Tabela%" echo %Linhah%
exit

:CriarTabela
set /a Contador+=1
IF %Contador% LEQ 12 set LinhaA=%LinhaA%;%Contador%
IF %Contador% LEQ 24 IF %Contador% GTR 12 set LinhaB=%LinhaB%;%Contador%
IF %Contador% LEQ 36 IF %Contador% GTR 24 set LinhaC=%LinhaC%;%Contador%
IF %Contador% LEQ 48 IF %Contador% GTR 36 set LinhaD=%LinhaD%;%Contador%
IF %Contador% LEQ 60 IF %Contador% GTR 48 set LinhaE=%LinhaE%;%Contador%
IF %Contador% LEQ 72 IF %Contador% GTR 60 set LinhaF=%LinhaF%;%Contador%
IF %Contador% LEQ 84 IF %Contador% GTR 72 set LinhaG=%LinhaG%;%Contador%
IF %Contador% LEQ 96 IF %Contador% GTR 84 set LinhaH=%LinhaH%;%Contador%
IF %Contador% EQU 96 goto :EOF
goto :CriarTabela

 

FYOTlD5.gif

 

Postado

@ricardo_br é quase isso, só na hora de organizar que não posso organizar em ordem sequencial, eu preciso organizar seguindo a lógica de transformar (tabela 01) o que está em linha, em colunas (uma transposição de matriz) independente do valor que está naquela posição (por isso aqueles loop s no código que postei).
 

tabela 01
	1	2	3	4	5	6	7	8	9	10	11	12
a	a1	a2	a3	a4	a5	a6	a7	a8	a9	a10	a11	a12
b	b1	b2	b3	b4	b5	b6	b7	b8	b9	b10	b11	b12
c	c1	c2	c3	c4	c5	c6	c7	c8	c9	c10	c11	c12
d	d1	d2	d3	d4	d5	d6	d7	d8	d9	d10	d11	d12
e	e1	e2	e3	e4	e5	e6	e7	e8	e9	e10	e11	e12
f	f1	f2	f3	f4	f5	f6	f7	f8	f9	f10	f11	f12
g	g1	g2	g3	g4	g5	g6	g7	g8	g9	g10	g11	g12
h	h1	h2	h3	h4	h5	h6	h7	h8	h9	h10	h11	h12
posições arquivo .wxx	posições arquivo .txt			
	a1			a1
	a2			b1
	a3			c1
	a4			d1
	a5			e1
	a6			f1
	a7			g1
	a8			h1
	a9			a2
	a10			b2
	a11			c2
	a12			d2
	b1			e2
	b2			f2
	b3			g2
	b4			h2
	b5			a3
	b6			b3
	b7			c3
	b8			d3
	b9			e3
	b10			f3
	b11			g3
	b12			h3
	c1			a4
	c2			b4
	c3			c4
	c4			d4
	c5			e4
	c6			f4
	c7			g4
	c8			h4
	c9			a5
	c10			b5
	c11			c5
	c12			d5
	d1			e5
	d2			f5
	d3			g5
	d4			h5
	d5			a6
	d6			b6
	d7			c6
	d8			d6
	d9			e6
	d10			f6
	d11			g6
	d12			h6
	e1			a7
	e2			b7
	e3			c7
	e4			d7
	e5			e7
	e6			f7
	e7			g7
	e8			h7
	e9			a8
	e10			b8
	e11			c8
	e12			d8
	f1			e8
	f2			f8
	f3			g8
	f4			h8
	f5			a9
	f6			b9
	f7			c9
	f8			d9
	f9			e9
	f10			f9
	f11			g9
	f12			h9
	g1			a10
	g2			b10
	g3			c10
	g4			d10
	g5			e10
	g6			f10
	g7			g10
	g8			h10
	g9			a11
	g10			b11
	g11			c11
	g12			d11
	h1			e11
	h2			f11
	h3			g11
	h4			h11
	h5			a12
	h6			b12
	h7			c12
	h8			d12
	h9			e12
	h10			f12
	h11			g12
	h12			h12

 

13 horas atrás, ricardo_br disse:

Se sua intenção é criar uma tabela assim em batch veja esse exemplo:

 

bdjPdwb.png

 

@echo off
SetLocal EnableDelayedExpansion

set Tabela=Tabela.csv

set LinhaA=A
set LinhaB=B
set LinhaC=C
set LinhaD=D
set LinhaE=E
set LinhaF=F
set LinhaG=G
set LinhaH=H

call :CriarTabela
>>"%Tabela%" echo %LinhaA%
>>"%Tabela%" echo %LinhaB%
>>"%Tabela%" echo %LinhaC%
>>"%Tabela%" echo %LinhaD%
>>"%Tabela%" echo %LinhaE%
>>"%Tabela%" echo %LinhaF%
>>"%Tabela%" echo %LinhaG%
>>"%Tabela%" echo %Linhah%
exit

:CriarTabela
set /a Contador+=1
IF %Contador% LEQ 12 set LinhaA=%LinhaA%;%Contador%
IF %Contador% LEQ 24 IF %Contador% GTR 12 set LinhaB=%LinhaB%;%Contador%
IF %Contador% LEQ 36 IF %Contador% GTR 24 set LinhaC=%LinhaC%;%Contador%
IF %Contador% LEQ 48 IF %Contador% GTR 36 set LinhaD=%LinhaD%;%Contador%
IF %Contador% LEQ 60 IF %Contador% GTR 48 set LinhaE=%LinhaE%;%Contador%
IF %Contador% LEQ 72 IF %Contador% GTR 60 set LinhaF=%LinhaF%;%Contador%
IF %Contador% LEQ 84 IF %Contador% GTR 72 set LinhaG=%LinhaG%;%Contador%
IF %Contador% LEQ 96 IF %Contador% GTR 84 set LinhaH=%LinhaH%;%Contador%
IF %Contador% EQU 96 goto :EOF
goto :CriarTabela

 

FYOTlD5.gif

 

Isso eu nem tinha pensado, mas pra esse problema não vai servir...mas sabe me dizer se consigo utilizar um batch pra gerar códigos de barras usando somente o excel e mandar pra impressora?(hj uso o excel para escrever os nomes e o labeljoy para gerar e imprimir essas etiquetas). Não sei se é possível abrir e controlar o programa por batch?

Postado

@ASam Não conheço esse labeljoy mais acredito que só usando batch não vai gerar um código de barras legível por um leitor de código de barras algo simples seria possível usando a letra "pipe" ||||  |  ||||||| || |||||||||||||

 

Mais recapitulando ao programa de reorganizar linhas em colunas. O primeiro passo e arrastar uma pasta até o batch que contem arquivos *.W##

 

Passo 02: renomear os arquivos conforme um arquivo contendo uma lista de nomes "ListadeNomes.txt"

 

Passo 03: Converter o conteúdo de cada um desses arquivos como se fosse de linhas para colunas conforme você mostrou.

 

É isso?

Postado

@ricardo_br é isso mesmo, só o primeiro passo que acho mais interessante deixar o .bat dentro da pasta onde vão estar o arquivo "ListadeNomes.txt" e os arquivos que vão ser trabalhados. ( assim eu crio um atalho pra esse .bat e só clico nele.

Postado

@ricardo_br se der pra colocar ele dentro de uma pasta "Backup" seria interessante

Aparentemente assim funcionou a conversão (testei com 2 arquivos só), dai pensei em mover pra um backup esse arquivo já renomeado, mas sem alteração. (só não sei como fazer)
Ex: O batch.bat, a Listadenomes.txt e os arquivos .Wxx todos na pasta D:\, o backup iria para D:\Backup\

 

@echo off
SetLocal EnableDelayedExpansion

:: Arraste a pasta onde estão os arquivos para o batch
:: Informe aqui o arquivo com a lista de nomes:
set "Lista=Listadenomes.txt"

if exist "%~1" (if not exist "%~1\" exit) else (exit)

set "Pasta=%~1"
pushd "%Pasta%"

for /f "tokens=1,2 usebackq" %%a in ("%Lista%") do if /i exist "%%a" ren "%%a" "%%b.tmp"

for /f "delims=" %%a in ('dir /b *.tmp ^|find /i /v "%Lista%"') do (
set "arquivo=%%a"
call :ReOrganizar "%%~a"
)
echo Fim Reorganizar
pause
popd
exit

:ReOrganizar
echo ReOrganizar
SETLOCAL DisableDelayedExpansion
set count=1
for /f "usebackq delims=" %%a in (`"findstr /n ^^ %arquivo%"`) do (
set "var=%%a"
SETLOCAL ENABLEDELAYEDEXPANSION
set "var=!var:*:=!"
set var[!count!]= !var!
set /a count=!count!+1
)
::Colocar comando para mover %arquivo% para Backup
for /l %%a in (1,1,12) do (
set contador= %%a
for /l %%b in (!contador!,12,96) do (

echo !var[%%b]! >> %arquivo%.txt

)
)

goto :EOF

 

Postado

@ricardo_br Esse já ficou bem complexo (vou levar algum tempo pra entender tudo, mas fiz alguns testes(com arquivos reais) e tem algumas questões:

  •  Se eu executar novamente o batch com algum arquivo (txt ou csv) na pasta ele modifica esses arquivos, inclusive adicionando mais linhas. - Isso é só no final mover estes arquivos para outra pasta.
  • Nos meus arquivos reais vou ter o caractere "&" seguido de um número (1,2,3,4,5,6) - normalmente nas posições A1,B1,C1,D1 e nas duas ultimas posições ocupadas (mas pode acontecer de "&" não aparecer em nenhuma posição) e quando faz a conversão aparece a mensagem:
'1' não é reconhecido como um comando interno

e no arquivo gerado, no lugar de &1, aparece: 

ECHO est  desativado.

 Eu não consigo trocar esse caractere "&" por outro no meu arquivo original e onde ele aparece eu preciso mantê-lo.

  • Nem todos os meus arquivos vão ter 96 posições, então vão ter linhas em branco no arquivo inicial. Mas após convertido eu queria apagar SOMENTE as linhas em branco que ficarem no final(após o ultimo número). As linhas em branco que porventura ficarem no meio do arquivo, eu preciso manter.

Teste.rar

Postado

@ricardo_br Quase perfeito, só quando eu tenho linhas em branco no arquivo inicial(posições C1 e C2 por exemplo), ele aparece a mensagem "ECHO est desativado."

Ex(primeira coluna é o arquivo inicial e segunda coluna o arquivo final-posições C1 e C2):

A1	A1
A2	B1
A3	ECHO est  desativado.
A4	D1
A5	E1
A6	F1
A7	G1
A8	H1
A9	A2
A10	B2
A11	ECHO est  desativado.
A12	D2
B1	E2
B2	F2
B3	G2
B4	H2
B5	A3
B6	B3
B7	C3
B8	D3
B9	E3
B10	F3
B11	G3
B12	H3
	A4
	B4
C3	C4
C4	D4
C5	E4
C6	F4
C7	G4
C8	H4
C9	A5
C10	B5
C11	C5
C12	D5
D1	E5
D2	F5
D3	G5
D4	H5
D5	A6
D6	B6
D7	C6
D8	D6
D9	E6
D10	F6
D11	G6
D12	H6
E1	A7
E2	B7
E3	C7
E4	D7
E5	E7
E6	F7
E7	G7
E8	H7
E9	A8
E10	B8
E11	C8
E12	D8
F1	E8
F2	F8
F3	G8
F4	H8
F5	A9
F6	B9
F7	C9
F8	D9
F9	E9
F10	F9
F11	G9
F12	H9
G1	A10
G2	B10
G3	C10
G4	D10
G5	E10
G6	F10
G7	G10
G8	H10
G9	A11
G10	B11
G11	C11
G12	D11
H1	E11
H2	F11
H3	G11
H4	H11
H5	A12
H6	B12
H7	C12
H8	D12
H9	E12
H10	F12
H11	G12
H12	H12


E para evitar que ele processar novamente os arquivos já convertidos, poderia colocar eles na pasta TXT(para os .TXT) e CSV(para os .CSV)?

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...