Что нового

Переход на следующую строку в .txt

L1nked

Новичок
Сообщения
7
Репутация
0
Версия AutoIt: 3.3.0.0

Описание:есть текстовый файл (C:\TXT\1.txt), в нем текст разбит по строчкам:

тел.: + 7 495 737 2441 факс: + 7 495 737 2483
Заказчик: 222602
ОАО Пивоваренная компания "Балтика" 194292 Санкт-Петербург 6 Верхний пер-к, д. 3 ИНН/КПП: 7830001405 / 780201001
Акт сдачи-приемки работ
от 25.02.2010 По договору:
Y600111/10 от 22.01.2010
Номер счета-фактуры
53551090002492/Y001/Y6
Номер поставки/Дата AKZ1
---Y60011
Контактное лицо/Телефон

Мне нужно скопировать из файлика вот этот номер:Y600111/10 и обозвать этот .txt файл этими цифрами("/" меняем на "_" - akt_Y600111_10.txt, номера всегда разные).
Для этого я ищу в файлике слово "По договору:", а дальше нужно сделать переход на следующую строку, чтобы скопировать 10 символов. Номер строки с необходимыми цифрами может меняться.

Очень сильно прошу помощи!

мои наброски)

Код:
$sCond = "По договору:"
$s2 = FileRead("С:\TXT\1.txt")
If StringRegExp($s2, "По договору:") then
$sCode = StringRegExpReplace($s2, "(?s).*" & $sCond & "(.{10}).*", "\1")
EndIf
$sName = "akt_" & $sCode & ".txt"
$sName = StringReplace($sName, "/", "_")
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
Если я все правильно понял, то как-то так:

Код:
$s2 = FileRead("1.txt")
Global $Matches = StringRegExp($s2, "По\s+договору:" & @CRLF & "\s*(\S+)", 1)
if @error = 0 Then 
	FileClose("1.txt")
	FileMove("1.txt", StringRegExpReplace($Matches[0], "\/", "_") & ".txt")
EndIf
 

amel27

Продвинутый
Сообщения
146
Репутация
55
немного модифицированный вариант Suppir и без переименования:

Код:
$sFile = FileRead("C:\TXT\1.txt")
$rName = "По договору:\s+(\S+)"

$aName = StringRegExp($sFile, $rName, 1)
If IsArray($aName) Then
	$sName = "akt_"& StringRegExpReplace($aName[0], "\W+", "_") &".txt"
	ConsoleWrite($sName &@CRLF)
EndIf
 
Автор
L

L1nked

Новичок
Сообщения
7
Репутация
0
Спасибо, работает, а не могли бы вы объяснить что означает \s+(\S+), \W+, в справке не нашел:
$rName = "По договору:\s+(\S+)"
"\W+"
и
Global $Matches = StringRegExp($s2, "По\s+договору:" & @CRLF & "\s*(\S+)", 1)
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
"По\s+договору:" & @CRLF & "\s*(\S+)"

означает:

"По" + "более одного пробельного символа" + "договору:" + "знак переноса строки" + "ноль или более пробельных символов" + "более одного НЕпробельного символа"

последний элемент и есть номер, который берется в переменную.


Советую почитать здесь (на английском, с примерами):
http://perldoc.perl.org/perlrequick.html
http://perldoc.perl.org/perlre.html
http://perldoc.perl.org/perlreref.html
http://perldoc.perl.org/perlretut.html

http://www.pcre.org/pcre.txt

Основополагающий труд по работе с регулярными выражениями:
Регулярные выражения. Дж. Фридл. (2-е или 3-е издание). Можно легко найти в интернете.

Программы для тестирования регулярных выражений:
http://www.weitz.de/regex-coach/
http://www.regexbuddy.com/
 

amel27

Продвинутый
Сообщения
146
Репутация
55
L1nked

Код:
\s+	непрерывная последовательность пропусков, включая перевод строки
\S+	непрерывная последовательность символов до первого пропуска
(\S+)	то же, но с выводом в выходной массив
\W+	непрерывная последовательность символов, не являющихся буквами/цифрами/_
 
Автор
L

L1nked

Новичок
Сообщения
7
Репутация
0
Спасибо за разъяснения, буду читать, а пока вопрос:
Как подправить чтобы он копировал именно 10 символов?
Так как тхт я беру путем распознавания из PDF, то может как-то криво распознаться и получится строка "Y600111/10от 22.01.2010" и соответственно он создаст файл Y600111/10от.txt так как копирует символы до встречи первого пробела, если я правильно понял.

Хотя если следовать из этой логики, то и "По договору:" может криво распознаться...(
 

Suppir

Продвинутый
Сообщения
967
Репутация
62
L1nked [?]
Как подправить чтобы он копировал именно 10 символов?


Тогда вот так:

Код:
$s2 = FileRead("1.txt")
Global $Matches = StringRegExp($s2, "По\s+договору:" & @CRLF & "(\S{10})", 1)
if @error = 0 Then 
    FileClose("1.txt")
    FileMove("1.txt", StringRegExpReplace($Matches[0], "\/", "_") & ".txt")
EndIf



\S{10} означает 10 непробельных символов.
\S* - любое количество (даже ноль)
\S+ - более одного
\S{2,} - более двух
\S{2, 7} - от двух до семи

это базовые квантификаторы.
 
Верх