извлечение определенных строк данных из нескольких текстовых файлов для преобразования в один файл csv

Во-первых, приношу свои извинения за мои плохие способности к кодированию, однако я потратил несколько часов на чтение форумов и взломал его, поэтому я был бы очень признателен за любую помощь в решении следующей проблемы:

У меня есть 3 текстовых файла, из которых я хотел бы взять имя файла, 3-ю строку данных, 5-ю строку и 7-ю строку и поместить их в один CSV, например:

filename1, linedata3, linedata5, linedata7
filename2, linedata3, linedata5, linedata7
filename3, linedata3, linedata5, linedata7

Простые, а? не так, потому что мне не хватает моих навыков кодирования, и я мог бы сделать с вашей помощью. Вот что у меня есть до сих пор:

Сначала пакетный файл (go.bat):

@echo off
for /f "skip=2 delims=" %%i in (%1) do >>lines.txt echo %~n1 %%i & goto :EOF

Затем ручные записи командной строки:

go.bat file1.txt
go.bat file2.txt
go.bat file3.txt

Итак, как видите, я сделал это для одной строки текста, но не знаю, как добавить строки 3 и 5 в конец вывода. Кроме того, мне бы очень хотелось, чтобы в командной строке была правильная запись, чтобы я мог сделать это для всех текстовых файлов в каталоге. Я пробовал следующее, но, похоже, что-то упустил:

for %i in (*.*) do go.bat "%i"

Любая помощь тела?

Большое спасибо! Джеймс


person user1007308    schedule 21.10.2011    source источник


Ответы (2)


@echo off
setlocal EnableDelayedExpansion
if exist result.csv del result.csv
for %%f in (*.txt) do (
    set i=0
    for /F "delims=" %%l in (%%f) do (
        set /A i+=1
        set line!i!=%%l
    )
    echo %%f, !line3!, !line5!, !line7! >> result.csv
)

Этот пакетный файл обрабатывает все файлы .txt в каталоге, как вы сказали.

person Aacini    schedule 21.10.2011
comment
+1, работает, но вылетает с восклицательными знаками и пустыми строками, и это очень сложно решить - person jeb; 22.10.2011

Вы можете прочитать строки с другой конструкцией.

setlocal EnableDelayedExpansion
< %1 (
Set /p line1=

Set /p line2=
Set /p line3=
Set /p line4=
Set /p line5=
Set /p line6=
Set /p line7=
)
Echo %1,!line3!,!line5!,!line7!

Или с петлей (Андрей)

Setlocal EnableDelayedExpansion
<%1 (
  For /L %%n in (1 1 7) do (
    Set /p line%%n=
  )
)
Echo %1,!line3!,!line5!,!line7!
person jeb    schedule 21.10.2011
comment
+1, но мне интересно, подойдет ли цикл FOR /L. Что-то вроде < %1 (FOR /L %%L IN (1,1,7) DO SET /P line%%L=). По сути, та же идея, что и у вас, только это будет цикл, а не повторение одинаковых строк. Что вы думаете? - person Andriy M; 22.10.2011
comment
@Andriy Ваша идея (об использовании цикла для чтения нескольких строк файла в нескольких строковых переменных) уже использовалась в другом ответе (мой ответ) в строке set line!i!=%%l. - person Aacini; 22.10.2011
comment
Да, вы также можете использовать цикл for/L, но, на мой взгляд, это совершенно другое решение, чем Aacini. - person jeb; 22.10.2011
comment
@Aacini: jeb прав, есть разница. Цикл, который я предложил, просто заменяет серию почти идентичных строк (SET /P lineX=). Это не меняет способ чтения файла. Это решение считывает файл с конструкцией < filename ( … ) в сочетании с набором команд SET /P line= (теперь замененных циклом), в то время как ваше использует цикл FOR /F для извлечения строк. Что ж, теперь вы можете убедиться в этом сами. - person Andriy M; 22.10.2011
comment
@Andriy: конечно, метод чтения файла совершенно другой: один метод использует set /p lineX= и читает только 7 строк, а другой метод использует FOR /F и читает все строки в файле. Однако метод использования цикла для хранения строк в нескольких переменных практически одинаков, в чем легко убедиться, сравнив команды, создающие переменные: set line!i!= и set /p line%%n=. В моем предыдущем комментарии я НЕ упомянул, что оба ответа представляют собой одно и то же решение (как сказал Джеб) и даже не один и тот же или похожий метод... - person Aacini; 23.10.2011
comment
... Я только что сказал, что ваша идея ИСПОЛЬЗОВАНИЯ ЦИКЛА ДЛЯ ЧТЕНИЯ НЕСКОЛЬКИХ СТРОК В НЕСКОЛЬКИХ ПЕРЕМЕННЫХ ранее была показана в моем ответе. Вот и все. Не вижу причин для ваших комментариев. Однако, после сказанного, я хотел бы отметить, что мой ответ представляет собой полное решение вопроса, который задал Джеймс, но ответ Джеба (и ваша модификация) является лишь частью такого решения. - person Aacini; 23.10.2011
comment
@Aacini: Да, похоже, я предполагал, что вы сравниваете решения, а не способы создания «массивов» в пакетных сценариях. Это было запутанно и очень неправильно с моей стороны, извините. Что касается моего первоначального вопроса, то он касался именно SET line%%n=, в чем у меня были кратковременные сомнения (и мне было лень проверять это самому). Я точно знал, что SET line!n!= было возможно, но FOR /L больше подходило в данной конкретной ситуации, и я только не был уверен, можно ли его использовать там так, как я имел в виду. - person Andriy M; 23.10.2011