Ayuda por favor!!!

Iniciado por Se7eN, 27 Diciembre 2017, 06:51 AM

0 Miembros y 1 Visitante están viendo este tema.

Se7eN

a partir de un archivo txt q tiene un formato como este:
(precio-producto-cantidad)
---------------
0.5-CAJA-0
10-CAJA-12
20-TANQUE-5
0.50-TANQUE-2
10-LATA-1
5-CAJA-5
1-LATA-0
0.25-TANQUE-0
----------------
me gustaria incluir en mi .bat que codigo que me cree otro txt para poder imprimir que haga lo sigt con esos datos:
los ordene por precio y productos de menor precio a mayor quedando mas o menos asi:
----------------
0.5-CAJA-0
5-CAJA-5
10-CAJA-12

0.25-TANQUE-0
0.50-TANQUE-2
20-TANQUE-5

1-LATA-0
10-LATA-1
---------------
tambien pense en eliminar de la lista los productos q tuviese en 0 quedando asi
--------------
5-CAJA-5
10-CAJA-12

0.50-TANQUE-2
20-TANQUE-5

10-LATA-1
--------------
a ver mi idea era:
-leer la linea y guardarla en una variable
-analizar la linea y si tiene un producto seguido de un -0 desecharlo (esto buscando una coincidencia en la linea *CAJA-0*) BUENO ESA ERA LA IDEA
-si al analizar la linea no contiene algo igaul al ejem: CAJA-0 entonces copiarla en un txt nuevo
-organizar el txt

logre algo como esto super basico xq soy muy noob

@echo off
FOR /F %%A IN (f1.txt) DO call :proceso "%%A"
goto:EOF
:proceso
set aki=%~1
echo %aki%
pause>nul
goto:EOF

pero en adelante me perdi
Nota: mi internet lo tengo q comprar x horas ademas de q tiene un ancho de banda de menos de 1mb de navegacion y 256kb de descarga x eso no me puedo dar el lujo de investigar tanto. DIGAN HOLA A LA WIFI DE CUBA!!! jaja

Si alguien sabe como resolver esto x favor ayudeme y si lo hacen y me demoro en agradecer es q no me he conectado a revisar XD!!!

Eleкtro

En Batch no merece la pena escribir ni una sola sentencia por lo limitado que es, y en consecuencia lo engorroso que resultaría.

¿Es para ti una opción válida el uso de PowerShell?. Practicamente tienes un CSV delimitado por guiones, puedes aplicar esta solución (la parte de importar la tabla CSV):

Y el resto sería realizar una ordenación por el nombre del campo del producto.

Saludos








Se7eN

amigo elektro gracias x responder primero q todo y feliz año nuevo de antermano. tienes mucha razon en lo que dices acerca del power shell y veo q con un poco de investigacion lograria lo que quiero mucho mas rapido que en batch pero resulta que lo que tengo es un .bat compilado a exe dentro del cual quiro incluir este codigo para mejorar mi pequeño programa, veras quiero hacer esto xq en realidad lo que quiero lograr es mandar a imprimir un txt especie a un reporte pero si organizara los datos me seria mucho mejor x eso mi insitencia en el tema que debe de ser en bath xq no se como integrar la solucion q me distes dentro de .bat, estuve revisando x ahi y hay un tema entero en el foro para hacer cosas con los txt en .bat, pero la respuesta en concreto que queria esta en ese tema lo que pasa es q me redirige hacia otro portal donde dice que el tema que busco fue borrado o algo asi SUERTE PARA MI jaja asi que tendre que implementar y darme algunos cabezasos con lo que ahi postearon x cierto muy instructivo,,, asi que de todas formas muchas gracias amigo  ;-)

Eleкtro

#3
Cita de: Se7eN en 29 Diciembre 2017, 23:31 PMlo que tengo es un .bat compilado a exe

El código Batch no es lenguaje de programación ni es algo que se le pueda atribuir la propiedad de ser compilable; ese tipo de programas "compiladores de Batch a .exe" lo que hacen es empacar el archivo y extraerlo en un directorio temporal, nada que no puedas reproducir con un SFX (self-extracting archive) de WinRAR por ejemplo... y ofreciendo mayor versatilidad en todos los aspectos (bueno, excepto ofuscación de código).

Cita de: Se7eN en 29 Diciembre 2017, 23:31 PMx eso mi insitencia en el tema que debe de ser en bath xq no se como integrar la solucion q me distes dentro de .bat

Siempre que el programa que estés utilizando para " "compilar" " el archivo.bat te permita hacer lo siguiente (con WinRAR podrías hacerlo sin problemas), podrías crear el archivo de script de Powershell ("archivo.ps1"), añadirlo junto al archivo.bat al generar el executable con los archivos empacados, y en tu archivo.bat añadir una sentencia para iniciar la consola de powershell pasándole como agumento la ruta del script de Powershell que quieres ejecutar. ¿Se entiende lo que digo?.

Sigo viendo eso mejor opción, que hacerlo directamente en Batch.




De todas formas si sigues empeñado en querer hacerlo en Batch...

Citar-leer la linea y guardarla en una variable
-analizar la linea y si tiene un producto seguido de un -0 desecharlo (esto buscando una coincidencia en la linea *CAJA-0*) BUENO ESA ERA LA IDEA
-si al analizar la linea no contiene algo igaul al ejem: CAJA-0 entonces copiarla en un txt nuevo

( PRIMERA PARTE DEL BATCH-SCRIPT )
Código (dos) [Seleccionar]
@Echo OFF & (CHCP 1252)1>Nul

(FOR /F "UseBackQ Tokens=* Delims=" %%# IN ("csv.txt") DO (
   (Echo "%%~#"|FIND "-0")1>NUL || (
       Echo %%~#
   )
))>"%TEMP%\csv.tmp"


Citar-organizar el txt

El tema de la ordenación ya es mucho más complicado en Batch, a menos que te conformases con una ordenación de String:
Código (dos) [Seleccionar]
(Type "%TEMP%\csv.tmp" | SORT)>"Nuevo.csv"

0.50-TANQUE-2
10-CAJA-12
10-LATA-1
20-TANQUE-5
5-CAJA-5


...entonces mejor usa PowerShell si o si para una ordenación numérica:
( SEGUNDA PARTE DEL BATCH-SCRIPT )
Código (inno) [Seleccionar]
(
 Echo.$csv = Import-Csv -Header "Name1", "Name2", "Name3" -delimiter '-' "%TEMP%\csv.tmp"
 Echo.$csv ^| %% { $_.Name1 = [int]$_.Name1 }
 Echo.$csv ^| Sort-Object "Name1"
)>"%TEMP%\temp.ps1"

(Powershell.exe -ExecutionPolicy Bypass -Command "& '"%TEMP%\temp.ps1"'")>"Nuevo.csv"

Pause & Exit /B 0


Resultado de ejecución:
Name1 Name2  Name3
----- -----  -----
   0 TANQUE 2
   5 CAJA   5
  10 CAJA   12
  10 LATA   1
  20 TANQUE 5


Y si quieres ordenar la tabla CSV tomando la segunda columna, en el código de arriba pásale "Name2" en vez de "Name1" como agumento del método Sort-Object...

Resultado de ejecución:
Name1 Name2  Name3
----- -----  -----
   5 CAJA   5    
  10 CAJA   12  
  10 LATA   1    
   0 TANQUE 2    
  20 TANQUE 5  


¡Feliz año nuevo!.








Se7eN

amigo elektro gracias nuevamente x tomarte el tiempo de responderme me ha servido de mucho esa respueta que posteastes mil gracias