Pregunta sobre batch-file – Lote - Leer el contenido de un archivo en una matriz

2

Tengo un archivo de texto con dos filas (por ejemplo, param.txt) que se muestra a continuación:

<code>Mar2012
dim1,dim2,dim3,dim4
</code>

Quiero leer este archivo por lotes y almacenar el contenido de la primera línea en una variable llamada cube_name. Cuando estoy leyendo la segunda línea, quiero dividir la cadena delimitada por comas dim1, dim2, dim3, dim4 y crear una matriz de cuatro elementos. Estoy planeando usar la variable y la matriz en la parte posterior de la secuencia de comandos.

El código que creé se muestra a continuación. El código no está funcionando como se esperaba.

<code>@echo off & setlocal enableextensions enabledelayedexpansion
set /a count_=0
for /f "tokens=*" %%a in ('type param.txt') do (
set /a count_+=1
set my_arr[!count_!]=%%a
)
set /a count=0
for %%i in (%my_arr%) do (
set /a count+=1
if !count! EQU 1 (
    set cube_name=%%i
)

if !count! GTR 1 (
    set dim_arr=%%i:@=,%
)
)
for %%i in (%dim_arr%) do (
echo %%i
)

echo !cube_name!
</code>

Puedo ver lo siguiente cuando ejecuto el código:

<code>C:\Working folder>test2.bat
ECHO is off.
</code>

Así que esto no parece funcionar y no puedo entender qué estoy haciendo mal. Soy bastante nuevo en el script por lotes, así que se agradece la ayuda

Tu respuesta

2   la respuesta
1


¿Intenta depurar o hacer eco de algo allí?

Simplemente puede agregar algunos ecos para ver por qué su código no puede funcionar.

<code>@echo off & setlocal enableextensions enabledelayedexpansion
set /a count_=0
for /f "tokens=*" %%a in ('type param.txt') do (
  set /a count_+=1
  set my_arr[!count_!]=%%a
)
echo ### show the variable(s) beginning with my_arr...
set my_arr

echo Part 2----
set /a count=0
echo The value of my_arr is "%my_arr%"
for %%i in (%my_arr%) do (
    set /a count+=1
    echo ## Count=!count!, content is %%i
    if !count! EQU 1 (
        set cube_name=%%i
    )

    if !count! GTR 1 (
        echo ## Setting dim_arr to "%%i:@=,%"
        set dim_arr=%%i:@=,%
        echo 
    )
)
for %%i in (%dim_arr%) do (
    echo the value of dim_arr is "%%i"
)

echo cube_name is "!cube_name!"
</code>

La salida es

<code>### show the variable(s) beginning with my_arr...
my_arr[1]=Mar2012
my_arr[2]=dim1,dim2,dim3,dim4
Part 2----
The value of my_arr is ""
cube_name is ""
</code>

Como puedes ver tu part2 falla completamente.

3

pero funciona. Todo después de eso es un desastre. Parece que piensas que las matrices son un concepto formal en lotes, cuando no lo son. Es posible trabajar con variables de una manera que se parece a las matrices. Pero las matrices verdaderas no existen dentro de lote.

Tu usas% my_arr% como si fuera una matriz, peromi_arr Ni siquiera está definido. Tienes variables definidasmi_arr [1] amdmi_arr [2] - Los paréntesis y el número son parte del nombre de la variable.

También parece que tienes una mala interpretación de los bucles FOR. Le sugiero que lea detenidamente la documentación FOR (escribaHELP FOR desde una línea de comando). También vea ejemplos en este y otros sitios. El comando FOR es muy complicado porque tiene muchas variaciones que se parecen al ojo no entrenado, pero tienen comportamientos muy diferentes. Un excelente recurso para ayudar a su comprensión eshttp://judago.webs.com/batchforloops.htm

Suponiendo que el archivo siempre tenga exactamente 2 líneas, resolvería su problema como tal

<code>@echo off
setlocal enableDelayedExpansion
set dimCnt=0
<param.txt (
  set /p "cube_name=" >nul
  set /p "dimList=" >nul
  for %%D in (!dimList!) do (
    set /a dimCnt+=1
    set "dim[!dimCnt!]=%%D"
  )
)
echo cube_name=!cube_name!
  for /l %%I in (1 1 !dimCnt!) do echo dim[%%I]=!dim[%%I]!
</code>

Una buena característica de la solución anterior es que permite un número variable de términos en la lista de dimensiones en la segunda línea. Fallará si hay pestañas, espacios, punto y coma, igual,* o? en los nombres de dimensiones. Hay formas relativamente simples de evitar esta limitación si es necesario.

Las pestañas, los espacios, el punto y coma e igual pueden manejarse utilizando la función de búsqueda y reemplazo para encerrar cada término entre comillas.

<code>  for %%D in ("!dimList:,=","!") do (
    set /a dimCnt+=1
    set "dim[!dimCnt!]=%%~D"
  )
</code>

No publicaré la solución completa aquí ya que no es probable que sea necesaria. Pero el manejo* y / o? requeriría reemplazar las comas con un carácter de nueva línea y cambiar a una instrucción FOR / F.

Preguntas relacionadas