Что нового

[Данные, строки] Удалить из файла похожие строки

erzhik_s

Новичок
Сообщения
4
Репутация
0
Существует файл с данными:

text1.text2
text.text1.text2
text4.text5
text3.text4.text5

Как удалить строки что бы в итоги было:
text1.text2
text4.text5
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
$file=FileRead(@ScriptDir&'\123')
$str=StringRegExpReplace($file,'.*?\d\s(text\d\.text\d)\r\n.*','\1')
$f=FileOpen(@ScriptDir&'\123',2)
FileWrite($f,$str)
FileClose($f)
 
Автор
E

erzhik_s

Новичок
Сообщения
4
Репутация
0
Спасибо!

А как сделать, если название текста не известно, но есть похожие строки
Пример:
string2.string3
string1.string2.string3.string4
text2.text3
text1.text2.text3.text4

Нашел функцию на форуме, но он только для дубликата.
Код:
$sFileName = "Test.txt"
$sFilePath = @ScriptDir & "\"
$sFile = $sFilePath & $sFileName

$iRet = _FileDeleteDuplicateLines($sFile, 100)
$iExtended = @extended

If $iRet = 1 And $iExtended > 0 Then
    MsgBox(64, "Results", StringFormat("В файле <%s> удалено дублирующихся строк: %i", $sFileName, $iExtended))
ElseIf $iExtended = 0 Then
    MsgBox(64, "Results", StringFormat("В файле <%s> нет дублирующихся строк.", $sFileName))
ElseIf @error = 1 Then
    MsgBox(48, "Ошибка", StringFormat("Файл <%s> не найден.", $sFileName))
ElseIf @error = 2 Then
    MsgBox(48, "Ошибка", StringFormat("Ошибка при попытке записи в Файл <%s>.", $sFileName))
EndIf

Func _FileDeleteDuplicateLines($sFile, $iCaseSense=0)
    If Not FileExists($sFile) Then Return SetError(1)
    Local $sFRead = FileRead($sFile)
    Local $aFSplit = StringSplit(StringStripCR($sFRead), @LF)
    Local $sFileContent = "", $iExtended = 0, $sLastChars = StringRight($sFRead, 2)
   
    ;Проходим весь массив, и проверяем каждую строку
    For $i = 1 To $aFSplit[0]
        If $aFSplit[$i] = "" Then ContinueLoop
       
        ;Тут делаем проверку в переменной, в которую скапливаются строки (не дублирующиеся)
        If Not StringInStr($sFileContent, $aFSplit[$i] & @CRLF, $iCaseSense) Then
            $sFileContent &= $aFSplit[$i] & @CRLF
        Else
            $iExtended += 1
        EndIf
    Next
   
    If $sLastChars <> @CRLF Then $sFileContent = StringTrimRight($sFileContent, 2)
   
    ;Пишем в файл уже без дублей
    Local $hFOpen = FileOpen($sFile, 2)
    If $hFOpen = -1 Then Return SetError(2)
   
    FileWrite($hFOpen, $sFileContent)
    FileClose($hFOpen)
   
    Return SetExtended($iExtended, 1)
EndFunc


Хотелось бы что-то похоже, но с удалением только те строки которые похожие.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
erzhik_s,
Особо не тестировал.
Код:
#include <Array.au3>

$aTemp = StringSplit(StringRegExpReplace(StringStripCR(FileRead(@ScriptDir & '\1.txt')), '((^[\n]{0,})|([\n]*$))', ''), @LF)

Dim $aCheckTemp[$aTemp[0] + 1][2] = [[$aTemp[0]]], $aCheck[$aTemp[0] + 1], $iCount

$aCheckTemp[1][1] = 1
For $i = 1 To $aTemp[0]
	$aCheckTemp[$i][0] = $aTemp[$i]
	If Not $aCheckTemp[$i][1] Then ContinueLoop
	For $j = $i + 1 To $aTemp[0]
		If Not $aTemp[$j] Then ContinueLoop
		If StringInStr($aTemp[$j], $aCheckTemp[$i][0]) Then
			$aCheckTemp[$j][1] = 0
		Else
			$aCheckTemp[$j][1] = 1
		EndIf
	Next
Next
$aTemp = ''
For $i = 1 To $aCheckTemp[0][0]
	If $aCheckTemp[$i][1] Then
		$iCount += 1
		$aCheck[$iCount] = $aCheckTemp[$i][0]
		$aTemp &= $aCheckTemp[$i][0] & @CRLF
	EndIf
Next
ReDim $aCheck[$iCount + 1]
$aCheck[0] = $iCount
_ArrayDisplay($aCheck)
MsgBox(64, 'Info', StringTrimRight($aTemp, 2))
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Код:
$str=StringRegExpReplace($file,'.*?(\S+\d\.\S+\d)\r\n.*','\1')
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
sngr,
А если строки будут другого вида?
 
Автор
E

erzhik_s

Новичок
Сообщения
4
Репутация
0
Строки одно типичные, разделены через точку.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Эта тема в разделе про регулярные выражения. Регулярные выражения ищут и находят только то, что заданно в шаблоне поиска. А если бабушка станет дедушкой, неизвестно что будет.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
[info border=#0000ff float=left] erzhik_s, на форуме принято помечать тему решенной после получения ответа на свой вопрос!
Вверху или внизу темы нажмите на ссылку такого вида:
package_old.gif
Тема не решена
[/info]
 
Верх