Что нового

Удаление пустых строк в файле

Ranos1982

Новичок
Сообщения
130
Репутация
1
Пытался игратся с массивами (так как нашел ф-цию удаления пустых строк в массиве) , но не получилось . Как реализовать,не подскажите? :whistle:
 
Автор
R

Ranos1982

Новичок
Сообщения
130
Репутация
1
madmasles
Я это видел.Но удалить с файла - не получилось ..(
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Ranos1982,
Пишем произвольный текст с пустыми строками в файл:
Код:
$sFile = @ScriptDir & '\Test.txt'
$sTestString = 'Test string number '
$sString = ''
For $i = 1 To 10000
	If Mod($i, 2) Then
		$sString &= @CRLF
	Else
		$sString &= $sTestString & $i & @CRLF
	EndIf
Next
For $i = 1 To 10
	$sString &= @CRLF
Next
$hFile = FileOpen($sFile, 2)
FileWrite($hFile, $sString)
FileClose($hFile)
Убираем пустые строки:
Код:
#include <Array.au3>

$sFile = @ScriptDir & '\Test.txt'
$sFileNew = @ScriptDir & '\TestNew.txt'
$hFile = FileOpen($sFile)
$sString = FileRead($hFile)
FileClose($hFile)
$aStringAll = StringSplit(StringStripCR($sString), @LF, 2)
_ArrayDisplay($aStringAll, 'До (' & UBound($aStringAll) & ' строк)')

$aStringClearEmpty = _ArrayClearEmpty($aStringAll)
$iEmpty = @extended
_ArrayDisplay($aStringClearEmpty, 'После (' & UBound($aStringClearEmpty) & ' строк) ' & $iEmpty & ' пустых удалили')
$sString = ''
For $i = 0 To UBound($aStringClearEmpty) - 1
	$sString &= $aStringClearEmpty[$i] & @CRLF
Next
$hFile = FileOpen($sFileNew, 2)
FileWrite($hFile, StringTrimRight($sString, 2))
FileClose($hFile)

; #FUNCTION# =================================================================================================
; Name...........: _ArrayClearEmpty
; Description ...: Удаляет из массива: 1-размерного пустые строки;
;                                      2-размерного пустые строки по индексу колонки.
; Syntax.........: _ArrayClearEmpty($a_Array, $i_SubItem = 0, $i_Start = 0)
; Parameters ....: $a_Array - массив, в котором удаляются пустые строки.
;                  |$i_SubItem  - индекс колонки (у 2-размерного массива)по которой идет поиск пустых строк,
;                  по умолчанию - первая колонка.
;                  |$i_Start - индекс строки начала поиска пустых строк, по умолчанию - 0(первая строка).
; Return values .: Успех - массив без пустых строк и @error = 0 и
;                  @extended - количество удаленных пустых строк.
;                  Неудача - 0 и @error = :
;                  | 1 - $a_Array не является массивом или его размерность больше 2
;                  | 2 - в 1-размерном массиве все строки пустые (см. Remarks);
;                        в 2-размерном массиве все строки пустые по индексу колонки $i_SubItem (см. Remarks).
; Author ........: madmasles (функция), идея: Yashied http://autoit-script.ru/index.php?topic=1905.msg13688#msg13688
; Remarks .......: если $i_Start > 0 и все строки, начиная с $i_Start пустые, то вернет массив со строками
;                  с 0 по $i_Start - 1 и @error = 0.
;                  Числовое значение строки 0 не считается пустым значением.
; ============================================================================================================
Func _ArrayClearEmpty($a_Array, $i_SubItem = 0, $i_Start = 0)
	If Not IsArray($a_Array) Or UBound($a_Array, 0) > 2 Then Return SetError(1, 0, 0)

	Local $i_Index = -1
	Local $i_UBound_Row = UBound($a_Array, 1) - 1
	Local $i_UBound_Column = UBound($a_Array, 2) - 1

	If $i_UBound_Column = -1 Then $i_UBound_Column = 0
	If $i_SubItem > $i_UBound_Column Then $i_SubItem = 0
	If $i_Start < 0 Or $i_Start > $i_UBound_Row Then $i_Start = 0

	Switch $i_UBound_Column + 1
		Case 1
			Dim $a_TempArray[$i_UBound_Row + 1]
			If $i_Start Then
				For $i = 0 To $i_Start - 1
					$a_TempArray[$i] = $a_Array[$i]
				Next
				$i_Index = $i_Start - 1
			EndIf
			For $i = $i_Start To $i_UBound_Row
				If String($a_Array[$i]) Then
					$i_Index += 1
					$a_TempArray[$i_Index] = $a_Array[$i]
				EndIf
			Next
			If $i_Index > -1 Then
				ReDim $a_TempArray[$i_Index + 1]
			Else
				Return SetError(2, 0, 0)
			EndIf
		Case 2
			Dim $a_TempArray[$i_UBound_Row + 1][$i_UBound_Column + 1]
			If $i_Start Then
				For $i = 0 To $i_Start - 1
					For $j = 0 To $i_UBound_Column
						$a_TempArray[$i][$j] = $a_Array[$i][$j]
					Next
				Next
				$i_Index = $i_Start - 1
			EndIf
			For $i = $i_Start To $i_UBound_Row
				If String($a_Array[$i][$i_SubItem]) Then
					$i_Index += 1
					For $j = 0 To $i_UBound_Column
						$a_TempArray[$i_Index][$j] = $a_Array[$i][$j]
					Next
				EndIf
			Next
			If $i_Index > -1 Then
				ReDim $a_TempArray[$i_Index + 1][$i_UBound_Column + 1]
			Else
				Return SetError(2, 0, 0)
			EndIf
	EndSwitch
	Return SetError(0, $i_UBound_Row - $i_Index, $a_TempArray)
EndFunc   ;==>_ArrayClearEmpty
 
Автор
R

Ranos1982

Новичок
Сообщения
130
Репутация
1
madmasles
благодарю,попробую..
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 471
Репутация
2 401
Без массивов:

Код:
_FileDeleteEmptyLines(@ScriptDir & "\File.txt")

Func _FileDeleteEmptyLines($sFile)
    Local $sFileContent = StringRegExpReplace(FileRead($sFile), "(\r?\n){1,}", "\1")
    Local $hFOpen = FileOpen($sFile, 2 + FileGetEncoding($sFile))
    FileWrite($hFOpen, StringStripWS($sFileContent, 3))
    FileClose($hFOpen)
EndFunc
 
Верх