Войти

Показать полную графическую версию : [решено] разбить по строкам txt


Страниц : 1 2 [3]

Iska
07-11-2015, 21:06
blackeangel, у Вас там в файле Unix'овские концы строк. И хотелось бы увидеть образцы Ваших файлов, из которых Вы будете делать замену (разумеется, так же — в архиве).

Вот примерная болванка на WSH на пробу:
Option Explicit

Dim strSourceFile
Dim strReplaceFile

Dim strContent
Dim strReplace


strSourceFile = "C:\Мои проекты\init\init.rc"
strReplaceFile = "C:\Мои проекты\init\Replace.rc"

With WScript.CreateObject("Scripting.FileSystemObject")
If .FileExists(strSourceFile) Then
If .FileExists(strReplaceFile) Then
With .OpenTextFile(strSourceFile)
strContent = .ReadAll()
.Close
End With

With .OpenTextFile(strReplaceFile)
strReplace = .ReadAll()
.Close
End With

With WScript.CreateObject("VBScript.RegExp")
.Global = True
.MultiLine = True
.IgnoreCase = True
.Pattern = "^( #Camera\n)([\s\S]+?)(\n #/dev/RT_Monitor)$"

If .Test(strContent) Then
strContent = .Replace(strContent, "$1" & strReplace & "$3")
Else
WScript.Echo "Can't find pattern [" & .Pattern & "]."
WScript.Quit 3
End If
End With

With .CreateTextFile(strSourceFile + ".txt")
.Write strContent
.Close
End With
Else
WScript.Echo "Can't find replace file [" & strReplaceFile & "]."
WScript.Quit 2
End If
Else
WScript.Echo "Can't find source file [" & strSourceFile & "]."
WScript.Quit 1
End If
End With

WScript.Quit 0

Сохраните приведённый код в файл с расширением .vbs, замените выделенное на пути к Вашим реальным исходному и заменяющему файлам. Результирующий файл получит имя исходного плюс «.txt». Посмотрите, что получается.

Foreigner, sed это программа, так понимаю, для поиска и замены текста? »
Это портированная из Unix утилита, редактор потока (Stream EDitor — SED (https://ru.wikipedia.org/wiki/Sed)). Для Windows можно взять, например, отсюда (http://gnuwin32.sourceforge.net/packages/sed.htm).

Georgio
07-11-2015, 21:10
blackeangel, надо было предупредить, что у Вас исходный файл в формате UNIX.


Код:

@echo off

set "file=init.rc"
set "marker_1=#Camera"
set "marker_2=#/dev/RT_Monitor"

for /f "delims=:" %%i in ('
2^>nul findstr/iln /c:"%marker_1%" /c:"%marker_2%" "%file%"
') do (
if not defined x (set x=%%i) else (set y=%%i)
)
for %%i in ("%file%") do (
for %%? in (1 2 3) do 2>nul del "%%~ni_%%?%%~xi"
for /f "delims=" %%j in ('2^>nul findstr/n "^" %%i') do (
set z=%%j
for /f "delims=:" %%k in ("%%j") do (
if %%k leq %x% (set n=1) else (if %%k lss %y% (set n=2) else (set n=3))
for /f %%l in ('set/a n') do >>"%%~ni_%%l%%~xi" cmd/v/c echo.!z:*:^^=!
)
)
)

exit/b

.


Полученные файлы будут в формате Windows.

blackeangel
07-11-2015, 22:01
Iska, спасибо большое конечно за vbs, но на моей машине эти скрипты не запустятся,так же как и js

Iska
07-11-2015, 22:01
но на моей машине эти скрипты не запустятся,так же как и js »
Запрет на исполнение скриптов?

blackeangel
07-11-2015, 22:17
Iska, наверное, поэтому предпочтение exe и bat

blackeangel
08-11-2015, 09:37
Georgio, спасибо, скрипт отработал великолепно

blackeangel
08-11-2015, 09:52
Foreigner, спасибо за вывод из файла нужных строк

blackeangel
09-11-2015, 08:55
Сделал сегодня так

echo #blackeangel>>init.rc
::выносит нужные строки в файл
:: 1й кусок
sed.exe -n "/# Copyright/,/#Camera/ p" init.rc | sed -r "/^.+#.+$/ d" > init1.rc
:: 2й кусок
sed.exe -n "/#Camera/,/#\/dev\/RT_Monitor/ p" init.rc | sed -r "/^.+#.+$/ d" > init2.rc
:: 3й кусок
sed.exe -n "/#\/dev\/RT_Monitor/,/#blackeangel/ p" init.rc | sed -r "/^.+#.+$/ d" > init3.rc

На выходе получил файл без комментариев содержащих пробелы.В чем проблема?
Файлы прилагаются,оригинал и разбитые

blackeangel
09-11-2015, 17:51
blackeangel, надо было предупредить, что у Вас исходный файл в формате UNIX.

Полученные файлы будут в формате Windows.

А как тогда вернуть назад в формат Unix?

Marakas5
10-11-2015, 09:19
Здравствуйте! Облазил весь интернет, решения не нашел, как модифицировать примеры в этом топике под себя понять не могу, поэтому прошу вашей помощи, надеюсь, не откажете.
Ситуация следующая: имеется file.txt, который нужно разбить на равное количество строк (с этим я справился), но сохранить результаты в разные папки (их список построчно лежит в list.txt) с одним и тем же (finish.txt) именем. Папок физически на диске нет, т.е. их надо сначала создать. Названия папок могут содержать точки.
Подскажите, пожалуйста, как это можно реализовать. Большое вам спасибо.

Iska
10-11-2015, 09:48
имеется file.txt, »
Хорошо бы было упаковать его в архив и приложить к сообщению.

который нужно разбить на равное количество строк »
Равное — это на сколько: надвое, натрое…?

с этим я справился) »
Покажите Ваш код.

их список построчно лежит в list.txt »
Аналогично: упаковать его в архив и приложить к сообщению.

Marakas5
10-11-2015, 10:25
Iska, спасибо за ваш ответ.
Равное — это на сколько: надвое, натрое…?
Извините, не уточнил - по 5 строк.
Покажите Ваш код
setlocal enabledelayedexpansion
set q=0
set N=5
for /F "delims= " %%i in (file.txt) do (
set /a q+=1
if !q! GTR !N! set /a N+=5
@echo %%i >> file!N!.txt
)
только он подглючивает, может заменить первый символ, добавляет пробелы в конце и в каждом файле создается лишняя строка, пока не понимаю как это побороть. Ну и сохранение тут работает в разные файлы, что не удовлетворяет условию задачи.
По поводу file.txt и list.txt - их содержимое может меняться, но пример я приложу.
Еще, возможно, это важный момент - исходный файл сохранен в UTF-8 и получившиеся файлы тоже должны быть в этой кодировке. И еще не уточнил, что в строках может встречаться символ "-", возможно, это важно.

Iska
10-11-2015, 10:48
Еще, возможно, это важный момент - исходный файл сохранен в UTF-8 »
А приложенный файл — в ANSI-1251. Как сие прикажете понимать?

Marakas5
10-11-2015, 11:28
Iska, вы помогли мне разобраться с интересной особенностью Notepad++ - в случае, если точка не стоит рядом с любой из строк "Кодировать в ...", то при попытке перекодировки ничего не происходит. В этом случае надо наживать "Преобразовать в..." и после этого уже можно кодировать. Не знал такого. Спасибо за ваше замечание.

Прикладываю исправленное.

blackeangel
10-11-2015, 16:20
Разбил файл вот так,может кому нибудь пригодится
if exist "Port\boot\rmdisk\*.tmp" del /q Port\boot\rmdisk\*.tmp >nul
::1 файл
for /f "delims=[] tokens=1*" %%a in ('find /i /n "# Add by MTK" ^< "Port\boot\rmdisk\init.rc"') do (
bin\sed.exe -n "1,%%a p" Port\boot\rmdisk\init.rc >Port\boot\rmdisk\init_1.tmp
)
::2 файл
bin\sed.exe -n "/# Add by MTK/,/# End of adding by MTK drivers/ p" Stok\boot\rmdisk\init.rc >Port\boot\rmdisk\init_2.tmp
bin\sed.exe -i "/# Add by MTK/ d" Port\boot\rmdisk\init_2.tmp
bin\sed.exe -i "/# End of adding by MTK drivers/d" Port\boot\rmdisk\init_2.tmp
::3 файл
bin\sed.exe -n "/# End of adding by MTK drivers/, $p" Port\boot\rmdisk\init.rc > Port\boot\rmdisk\init_3.tmp


Хотя может есть предложения как сделать проще?




© OSzone.net 2001-2012