Скопировать заданное количество строк из 1 файла в другой файл

У меня есть файл, в котором есть пара 100 строк. Я хочу сохранить только часть и отказаться от остального. Сначала я создаю функцию, которая дает мне номер строки, на которой файл действительно должен заканчиваться, используя это:

for /f "tokens=1 delims=:" %%a in ('
findstr /n /c:"(search term)" "(source file location and name)"
') do set start=%%a
SET /A truestart=%start%-1

Это дает мне значение строки, которое на 1 выше искомого термина, и это именно то, что я хочу. Например. значение равно 600, поэтому строки с 1 по 599 копируются в другой файл и игнорируется строка 600 для завершения документа.

Я пытался найти решение, думая, что мне следует использовать форму цикла для копирования строк одну за другой в новый файл до тех пор, пока не будет достигнута указанная строка.

Я нашел этот цикл на этой странице, который должен делать то, что я хочу:

setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION

:: set counter
set c=0
for /f "delims=|" %%i in ("source file location and name") do (
:: increment counter for each line read
  set /a c=!c!+1
  if !c! leq %truestart% echo %%i >> "destination file location and name"
)

Это дает мне новый файл, но он копирует в целевой файл только местоположение и имя исходного файла, а не содержимое источника.

Итак, я знаю, что мне что-то не хватает, читая источник по каждой строке, но я не могу понять, что именно.

Я также попробовал использовать больше:

more /e /p +%truestart% "source file location and name" > "destination file location and name"

Это дает мне противоположный результат: отображается только та часть, которую я хочу убрать, и не учитывается то, что я действительно хочу.

Не используйте недопустимые ярлыки в качестве идентификатора комментария. Для этого есть команда REM. Недопустимые метки внутри блока кода/цикла имеют тенденцию совершать неожиданные действия (например, пропуск строк).

Stephan 03.06.2024 14:55

Прочтите for /? еще раз: ваш синтаксис оценивает не содержимое файла, а литеральную строку (имя файла). См. оператор usebackq.

Stephan 03.06.2024 14:57

Команду set можно сократить до set /a c+=1

Squashman 03.06.2024 17:02

Кроме того, в первом представленном вами примере вы могли бы упростить set start=%%a, а затем после цикла поставить SET /A truestart=%start%-1, используя только set /a truestart = %%a - 1.

Compo 03.06.2024 18:26
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Спасибо за предложения. Я немного почистил его, основываясь на ваших предложениях. После небольшого исследования я нашел лучший обходной путь.

Мне удалось получить желаемый результат с помощью PowerShell:

@echo off

rem set final line
for /f "tokens=1 delims=:" %%a in ('
findstr /n /c:"(search term)" "(source document)"
') do set /a end=%%a-2

set "inputFile = "(source document)""
set "outputFile = "(destination document)""
 
powershell -Command "Get-Content -Path '%inputFile%' -TotalCount %end% | Set-Content -Path '%outputFile%'"

Это дает мне именно тот результат, который я хочу.

Если вы хотите, чтобы вышеизложенное было правильным, то есть чтобы PowerShell-Command оставалось неизменным, вы должны изменить set "inputFile = "(source document)"" и set "outputFile = "(destination document)"" на Set "inputFile=(source document)" и Set "outputFile=(destination document)" соответственно. В противном случае вложенные двойные кавычки разобьются на проанализированную команду, переданную powershell.exe.

Compo 14.06.2024 00:45

Другие вопросы по теме