Что нового

Удалить текст после последнего пробела

Huge_it

Новичок
Сообщения
10
Репутация
0
Есть файл, в нем текст разделенный пробелами(пустой строкой).

Пример:
Бренд: Nomura
Модель: Baby Popper

Форма: popper
Частота колебаний: низкочастотный

Размеры и вес
Длина: 60 мм
Вес: 8 г

Дополнительная информация
Плавучесть: плавающий
Особенность: шумовая камера
Техника ловли: Stop&Go, равномерная проводка, твичинг
Специализация: щука, окунь
Расцветка: естественная
Цвет: желтый

Страна-производитель: Япония



Нужно удалить только текст(все знаки) после слова "желтый".
То есть, после слова "желтый" всё должно удаляться, включая возврат каретки и перевод строки.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Код:
#include <file.au3>

$sFilePath = @ScriptDir & "\test1.txt"
$sLines = _FileCountLines($sFilePath)
For $i = 1 To $sLines
    $str = FileReadLine($sFilePath, $i)
    FileWriteLine(@ScriptDir & "\test2.txt", $str)
	If StringInStr($str, "желтый") Then
		ExitLoop
	EndIf
Next
FileDelete($sFilePath)
FileMove(@ScriptDir & "\test2.txt", $sFilePath)
 
Автор
H

Huge_it

Новичок
Сообщения
10
Репутация
0
hedji, нужно удалять не именно после конкретного слова "желтый", а после любого последнего слова перед последней пустой строкой.
Там могут быть и цифры и скобки и слеши и запятые, в общем все символы, вводимые с клавиатуры.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
StringRegExpReplace($Text, "\R{2,}.*$", "")
 

hedji

Продвинутый
Сообщения
409
Репутация
94
OffTopic:

Huge_it сказал(а):
hedji, нужно удалять не именно после конкретного слова "желтый", а после любого последнего слова перед последней пустой строкой.

Huge_it сказал(а):
Нужно удалить только текст(все знаки) после слова "желтый".
То есть, после слова "желтый" всё должно удаляться, включая возврат каретки и перевод строки.

Как ТЗ написано, так оно и выполнено ;D

4613fc2746694b0cb362b13299b73b73.jpg


 
Автор
H

Huge_it

Новичок
Сообщения
10
Репутация
0
InnI сказал(а):
Код:
StringRegExpReplace($Text, "\R{2,}.*$", "")

Работает, но убирает только одну строчку, в данном примере "Страна-производитель: Япония". А их может быть много.
Нужно же удалять всё после нахождения последнего видимого/клавиатурного символа перед последней пустой строкой, то есть в данном случае всё после слова "желтый". А может быть например звездчока или скобки вместо "желтый".
В крайнем случае можно задать некоторое избыточное количество удаляемых строк, скажем 55.

Вариант попроще: начиная с конца по очереди удалять все НЕпустые строки.

Пока что задача не решена.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Код:
$Text = ClipGet()
$Text = StringLeft($Text, StringInStr($Text, @CRLF & @CRLF, 0, -1) - 1)
ConsoleWrite($Text & @CRLF)
 
Автор
H

Huge_it

Новичок
Сообщения
10
Репутация
0
InnI, что-то не выходит, удаляет всё содержимое, правда я в этом дуб дубом.
Можете дать полностью готовый скрипт для файла C:\samplefile.txt , с таким содержимым? :

Бренд: Nomura
Модель: Baby Popper

Форма: popper
Частота колебаний: низкочастотный

Размеры и вес
Длина: 60 мм
Вес: 8 г

Дополнительная информация
Плавучесть: плавающий
Особенность: шумовая камера
Техника ловли: Stop&Go, равномерная проводка, твичинг
Специализация: щука, окунь
Расцветка: естественная
Цвет: желтый

Страна-производитель: Япония
33333333333333333
5555555555555555
66666666666666666666666
463545643676766
6784897969
8888888888888
8888888888888888

Удалить нужно всё после "желтый", причем количество строк к удалению неизвестно.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
А последняя строка всегда будет "Цвет: ....."?
Просто между Модель и Форма тоже строки через одну идут.

Если цвет всегда последняя строка, то можно так:
Код:
#include <file.au3>

$sFilePath = @ScriptDir & "\test1.txt"
$sLines = _FileCountLines($sFilePath)
For $i = 1 To $sLines
    $str = FileReadLine($sFilePath, $i)
    FileWriteLine(@ScriptDir & "\test2.txt", $str)
    If StringInStr($str, "Цвет:") Then
        ExitLoop
    EndIf
Next
FileDelete($sFilePath)
FileMove(@ScriptDir & "\test2.txt", $sFilePath)
 
Автор
H

Huge_it

Новичок
Сообщения
10
Репутация
0
hedji сказал(а):
А последняя строка всегда будет "Цвет: ....."?
Просто между Модель и Форма тоже строки через одну идут.

Нет, последняя строка может быть любой, поэтому нужно просто определить последнюю пустую строку и удалить всё после неё, желательно включая и саму пустую строку .
Я предложил вариант просто найти конец файла и поочередно удалять все НЕпустые строки вверх.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Huge_it [?]
скрипт для файла C:\samplefile.txt
Код:
$Text = FileRead("C:\samplefile.txt")
If @error Then Exit MsgBox(0, "Error", "Ошибка чтения файла")
$Text = StringLeft($Text, StringInStr($Text, @CRLF & @CRLF, 0, -1) - 1)
MsgBox(0, "Text", $Text)
 
Автор
H

Huge_it

Новичок
Сообщения
10
Репутация
0
InnI сказал(а):
Huge_it [?]
скрипт для файла C:\samplefile.txt
Код:
$Text = FileRead("C:\samplefile.txt")
If @error Then Exit MsgBox(0, "Error", "Ошибка чтения файла")
$Text = StringLeft($Text, StringInStr($Text, @CRLF & @CRLF, 0, -1) - 1)
MsgBox(0, "Text", $Text)

Не работает. Это полный скрипт? Может нужно fileopen и т.д. ?
 
Автор
H

Huge_it

Новичок
Сообщения
10
Репутация
0
InnI сказал(а):
Huge_it [?]
Что конкретно не работает? Как минимум одно сообщение должно быть.
Окно показывает, что после "желтый" ничего нет, но в файле остается весь текст.
Сойдет и найти конец файла и поочередно удалять все НЕпустые строки вверх, может так проще.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Huge_it [?]
в файле остается весь текст
Ну, естественно. Вы же просили: "Нужно удалить только текст". Про перезапись файла речи не было ;)
Пробуйте (для работы в корне диска С: могут потребоваться права администратора)
Код:
;~ #RequireAdmin

$Path = "C:\samplefile.txt"

If Not FileExists($Path) Then Exit MsgBox(0, "Error", "Файл не найден: " & $Path)
$Enc = FileGetEncoding($Path)
$File = FileOpen($Path, $Enc)
If @error Then Exit MsgBox(0, "Error", "Ошибка чтения файла: " & $Path)
$Text = FileRead($File)
FileClose($File)

$Text = StringLeft($Text, StringInStr($Text, @CRLF & @CRLF, 0, -1) - 1)
;~ MsgBox(0, "Text", $Text)

$File = FileOpen($Path, 2 + $Enc)
If @error Then Exit MsgBox(0, "Error", "Ошибка записи файла: " & $Path)
FileWrite($File, $Text)
FileClose($File)
;~ ShellExecute($Path)
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Вариант снизу вверх до первой пустой строки снизу:
Код:
$sFilePath = @ScriptDir & "\test1.txt"
$arr1=FileReadToArray($sFilePath)
$end=0

For $i=UBound($arr1)-1 To 0 Step -1
	If StringLen($arr1[$i])=0 Then
		$end=$i
		ExitLoop
	EndIf
Next

For $i=0 To $end
	FileWriteLine(@ScriptDir & "\test2.txt", $arr1[$i])
Next

FileMove(@ScriptDir & "\test2.txt", $sFilePath, 1)
 
Автор
H

Huge_it

Новичок
Сообщения
10
Репутация
0
InnI сказал(а):
Huge_it [?]
в файле остается весь текст
Ну, естественно. Вы же просили: "Нужно удалить только текст". Про перезапись файла речи не было ;)

InnI, я тут состряпал такое -
Код:
$hFile  = fileopen("C:\Users\admin\Desktop\samplefile.txt")
$Text    = FileRead($hFile)

FileClose($hFile)

$Text = FileRead("C:\Users\admin\Desktop\samplefile.txt")
If @error Then Exit MsgBox(0, "Error", "?????? ?????? ?????")
$Text = StringLeft($Text, StringInStr($Text, @CRLF & @CRLF, 0, -1) - 1)
MsgBox(0, "Text", $Text)


$hFile  = fileopen("C:\Users\admin\Desktop\samplefile.txt", 2)
FileWrite ($hFile, $Text)
FileClose($hFile)


вставил ваш regexp и вроде работает! Вместо диска С: задал рабочий стол во избежание...
Пока потестирую, и если всё нормально, то завтра помечу тему как решенную. И посмотрю еще решение от hedji. До завтра.
 
Автор
H

Huge_it

Новичок
Сообщения
10
Репутация
0
hedji сказал(а):
Вариант снизу вверх до первой пустой строки снизу:
Код:
$sFilePath = @ScriptDir & "\test1.txt"
$arr1=FileReadToArray($sFilePath)
$end=0

For $i=UBound($arr1)-1 To 0 Step -1
	If StringLen($arr1[$i])=0 Then
		$end=$i
		ExitLoop
	EndIf
Next

For $i=0 To $end
	FileWriteLine(@ScriptDir & "\test2.txt", $arr1[$i])
Next

FileMove(@ScriptDir & "\test2.txt", $sFilePath, 1)

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

Я прогнал следующий файл:
Бренд: Nomura
Модель: Baby Popper

Форма: popper
Частота колебаний: низкочастотный

Размеры и вес
Длина: 60 мм
Вес: 8 г

Дополнительная информация
Плавучесть: плавающий
Особенность: шумовая камера
Техника ловли: Stop&Go, равномерная проводка, твичинг
Специализация: щука, окунь
Расцветка: естественная
Цвет: желтый

Страна-производитель: Япония
33333333333333333
5555555555555555
66666666666666666666666
463545643676766
6784897969
8888888888888
8888888888888888

и получил результат :

Бренд: Nomura
Модель: Baby Popper

Форма: popper
Частота колебаний: низкочастотный

Размеры и вес
Длина: 60 мм
Вес: 8 г

Дополнительная информация
Плавучесть: плавающий
Особенность: шумовая камера
Техника ловли: Stop&Go, равномерная проводка, твичинг
Специализация: щука, окунь
Расцветка: естественная
Цвет: желтый

Страна-производитель: Япония
33333333333333333
5555555555555555
66666666666666666666666
463545643676766
6784897969
8888888888888
8888888888888888Бренд: Nomura
Модель: Baby Popper

Форма: popper
Частота колебаний: низкочастотный

Размеры и вес
Длина: 60 мм
Вес: 8 г

Дополнительная информация
Плавучесть: плавающий
Особенность: шумовая камера
Техника ловли: Stop&Go, равномерная проводка, твичинг
Специализация: щука, окунь
Расцветка: естественная
Цвет: желтый

Так что лишнее действительно вырезается, но оригинальный текст таки остался в начале.
В общем, близко, только надо убрать оригинал, а то он так и остался.
 

hedji

Продвинутый
Сообщения
409
Репутация
94
Такой вариант проверьте, исправленный текст сохранится в файл test2.txt, если сработает, будем думать почему оригинал не перезаписался (на моем ПК перезаписывает).
Код:
$sFilePath = @ScriptDir & "\test1.txt"
$arr1=FileReadToArray($sFilePath)
$end=0

For $i=UBound($arr1)-1 To 0 Step -1
    If StringLen($arr1[$i])=0 Then
        $end=$i
        ExitLoop
    EndIf
Next

For $i=0 To $end
    FileWriteLine(@ScriptDir & "\test2.txt", $arr1[$i])
Next
 
Автор
H

Huge_it

Новичок
Сообщения
10
Репутация
0
hedji, вроде работает, но очень медленно, хвост из 27 строк удалял секунд 15. Странно. Правда файл был 400 кв.
Да, счас посмотрел, test2.txt получился в 2 раза больше чем test1.txt . Пардон, ошибся. Примерно одинаковый размер.

Прошу иметь в виду, мой файл-пример это просто пример, не более. Смысл в том, чтобы найти и удалить последний параграф, какого размера и вида, не важно.


Добавлено:
Сообщение автоматически объединено:

InnI сказал(а):
Huge_it [?]
скрипт для файла C:\samplefile.txt
Код:
$Text = FileRead("C:\samplefile.txt")
If @error Then Exit MsgBox(0, "Error", "Ошибка чтения файла")
$Text = StringLeft($Text, StringInStr($Text, @CRLF & @CRLF, 0, -1) - 1)
MsgBox(0, "Text", $Text)

Работает отлично. Большое спасибо!
 
Верх