Acciones sobre archivos de texto. [Batch]

Iniciado por leogtz, 24 Enero 2009, 00:30 AM

0 Miembros y 4 Visitantes están viendo este tema.

dazofeifa

#30
Hola, no encontré algo parecido a lo que ocupo: requiero tomar un archivo de texto generado por un Backup y extraer de él una parte de texto de una las lineas, para luego tomar esa parte del texto para realizar otra acción, específicamente, es el nombre y ruta de los archivos que no se pudieron respaldar porque están en uso, para luego con este nombre de archivo y su ruta, llamar a otro tipo de backup que funciona aunque los archivos estén bloqueados. He logrado extraer del log la línea donde muestra el error (con for y findstr y asignando valor a variable) pero, no se cómo sacar de ella sólo lo que necesito.  Eje:
La linea extraída es:
2009/11/23 14:02:15 ERROR 33 (0x00000021) Copying File D:\Respaldo\out\res.pst
yo solo ocupo : D:\Respaldo\out\res.pst (este dato es variable de acuerdo al archivo que esté bloqueado).

Agradezco su ayuda.

leogtz

¿Qué código has utilizado para obtener esta línea?:
2009/11/23 14:02:15 ERROR 33 (0x00000021) Copying File D:\Respaldo\out\res.pst
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

flony

dazofeifa deberias usar la extraccion de caracteres es
Citarnos permita obtener "trozos" de variables llamados subcadenas, existen varias formas para ello, siendo la principal:
Código:SET VariableResultado=%VariableOriginal:~m,n%


Almacena en la VariableResult ado la subcadena que existen en la VariableOrigin al desde la posición "m" durante "n" caracteres.

si un problema no tiene solucion entonces no es un problema...es algo inevitable

leogtz

En cualquier caso yo buscaría la solución en Perl, mira este ejemplo:

Código (perl) [Seleccionar]
#!/usr/bin/perl
use warnings;
use strict;
open(FILE, q[<], "file.txt") or die("No se pudo acceder al archivo. $!\n");
while(<FILE>)
{
if(/:/)
{
print(split(/.*File\s/, $_));
}
}
exit(0);


Tengo este archivo de texto similar a lo que tu obtienes:
2009/11/23 14:02:15 ERROR 33 (0x00000021) Copying File D:\Respaldo\out\res.pst
2009/11/23 14:02:15 ERROR 33 (0x00000021) Copying File D:\Respaldo\out\res.pst
2009/11/23 14:02:15 ERROR 33 (0x00000021) Copying File D:\Respaldo\out\res.pst
2009/11/23 14:02:15 ERROR 33 (0x00000021) Copying File D:\Respaldo\out\res.pst
2009/11/23 14:02:15 ERROR 33 (0x00000021) Copying File D:\Respaldo\out\res.pst
2009/11/23 14:02:15 ERROR 33 (0x00000021) Copying File D:\Ruta espacios\etc jkalaksd\file.algo


Y lo que obtengo al ejecutar el script:

leo@lein:~/Escritorio$ perl pl.pl
D:\Respaldo\out\res.pst
D:\Respaldo\out\res.pst
D:\Respaldo\out\res.pst
D:\Respaldo\out\res.pst
D:\Respaldo\out\res.pst
D:\Ruta espacios\etc jkalaksd\file.algo
leo@lein:~/Escritorio$
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

<< Lucas, ¿quién más? >>

Buena información, justo que me estaba olvidando un poco de todo esto. Me viene al pelo en un trabajo que debo presentar
Saludos


Personalmente, prefiero tecnologías de Microsoft. Yo reconozco que defendí el software libre, pero ahora yo quiero vivir de esto. Mi trabajo.

carlosguay

Ya que mi problema es de archivos de texto, lo pongo aqui por no abrir otro hilo.

Primero decir que gracias a este hilo, e podido solucionar muchas de las cosas que estoy haciendo com mis archivos, gracias a leo por este aporte.

Vereis tengo un problema que no se como solucionar con este archivo.

 
Citarad 55 6b b9   ad b6 ef ba   05 bc 36 9d   3c 86 43 38
  bf cf 2f bf   4a 8b d7 09   4d 02 41 00   bc c7 88 fd 
  f7 19 be aa   03 c6 18 ee   b3 2c b9 b8   73 89 0b 72 
  06 57 8b c9   77 b3 79 c3   4f 5f db 60   e7 89 bd 55 
  06 90 79 12   f6 84 67 b1   84 c4 dc 22   5b 3a 7f 45 
  ac 5d 14 7e   1d c6 b9 65   8f 6c 37 36| .].~...e.l76

LINEA CON TEXTO


Este archivo, en la parte de la derecha, lleva codigo acssi, que como veis no tengo problema en quitarlo, pero ya veis que en el penultimo renglon ya que la parte de hex no llega hasta el final, pues me deja parte del acssi.

Os pondria de las formas que e intentado quitar la ultima linea y la parte de acsii, pero ya se me an olvidado, xd, siempre consigo esto.


Citar
ad 55 6b b9 ad b6 ef ba 05 bc 36 9d 3c 86 43 38
bf cf 2f bf 4a 8b d7 09 4d 02 41 00 bc c7 88 fd
f7 19 be aa 03 c6 18 ee b3 2c b9 b8 73 89 0b 72
06 57 8b c9 77 b3 79 c3 4f 5f db 60 e7 89 bd 55
06 90 79 12 f6 84 67 b1 84 c4 dc 22 5b 3a 7f 45


Como veis no solo borro la ultima linea y la parte de acsii, sino que tambien borro la linea completa y se seguro que es por |, toma como ultima linea esa y eso es lo que pasa.

Pues si alquien me puede ayudar, me haria un gran favor.

saludos



pmabres

Buenas... estoy en el trabajo intentando hacer un script para insertar datos desde archivos .dbf en una base de datos oracle... desde esos dbf puedo generar dos archivos .sql (uno que trae la creacion de tablas y otro que trae los inserts a hacer)... el problema que tengo ahora es que los insert deberian llevar el nombre de la tabla luego de la instruccion "insert into"... pero no hay nada. Casualmente el nombre de cada tabla es el nombre del archivo en donde se encuentra cada insert pero sin la extension .sql
mi pregunta es...
como hago para poner el nombre del archivo mismo en el que esta cada insert, luego de cada instruccion insert into

pmabres

bueno pude hacer lo que queria pero lo que no puedo hacer ahora es cambiar el texto que quiero reemplazar por el texto que quiero reemplazar + una variable "que toma el nombre del archivo"

aca esta mi codigo....


@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in ('type C:\MB\DATOS\MB\insert\*.sql') do (
for %%p in (C:\MB\DATOS\MB\Insert\*.sql) do (
set nombre=%%~np
set linea=%%x
set linea=!linea:INTO=INTO %nombre%!
call :show !linea!
))
goto:eof
:show
echo %nombre%
pause
echo %* >> C:\MB\DATOS\MB\insert\%nombre%.sql
goto:eof


pmabres

#38

@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in ('type C:\MB\DATOS\MB\insert\final\*.sql') do (
for %%p in (C:\MB\DATOS\MB\Insert\final\*.sql) do (
set nombre=%%~np
set linea=%%x
set linea=!linea:INSERT INTO=INSERT INTO TMP_%%~np!
call :show !linea!
))
goto:eof
:show
echo %* >> C:\MB\DATOS\MB\insert\%nombre%.sql
goto:eof

con esto estaria solucionado el tema del nombre del archivo....

el tema es que inserta dos veces los datos en el mismo file... no saben como peudo hacer para solucionar esto?

ya se que hace dos veces el for, pero no encuentro la manera de sacar el nombre del archivo actual, y de usar el type para meter los datos en una variable

pmabres

pude solucionarlo!... un poco rústico pero pude jeje... dejo el codigo por las dudas


@echo off
setlocal enabledelayedexpansion
for %%p in (C:\MB\DATOS\MB\Insert\orig\*.sql) do (
set nombre=%%~np
type %%~fp > temp.txt
for /f "tokens=* delims=" %%x in ('type temp.txt') do (
set linea=%%x
set linea=!linea:INSERT INTO=INSERT INTO TMP_%%~np!
call :show !linea!
))
goto:eof
:show
echo %* >> C:\MB\DATOS\MB\insert\temp\%nombre%.sql
goto:eof



lo que hice fue crear un archivo temporal, que luego se borrará