Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Удаление всех пробельных символов в текстовых файлах. (http://forum.oszone.net/showthread.php?t=346784)

serg515 21-10-2020 19:52 2937130

Удаление всех пробельных символов в текстовых файлах.
 
Вложений: 1
Нужно удалить все пробелы + возможный перевод каретки и в некоторых случаях переносы строк(так как, кое-где это тоже самое).
Есть большое количество текстовых файлов с пробелами в папке.
Нужно удалить все пробелы и т.д. из содержимого.
т.е.

пробел текст пробел текст пробел
пробел текст пробел текст пробел
пробел текст пробел текст пробел
пробел текст пробел текст пробел
пробел

надо:

текст
текст
текст
текст
здесь строка не пустая,её просто нет,точнее не должно быть.

Есть код:
Код:

setlocal EnableDelayedExpansion
set folder=,\fld\
for %%i in (%folder%*) do call :del_blanks %folder% %%i
exit /b

:del_blanks
ren %1%2 file.tmp
for /f "tokens=*" %%i in (%1file.tmp) do @set ss=%%i & echo! ss: =!>> %1%2
del %1file.tmp
exit /b

но где-то в нём ошибка..??

Iska 21-10-2020 22:15 2937150

Цитата:

Цитата serg515
но где-то в нём ошибка..?? »

Одна большая ошибка — в использовании пакетного файла.

Пользуйте WSH/PoSH.

DJ Mogarych 21-10-2020 22:32 2937152

Цитата:

Цитата serg515
Нужно удалить все пробелы »

Откуда? Из имён файлов или из их содержимого?

Из имён можно так (powershell):
Код:

dir "C:\temp\folder\*.txt" |% {ren $_.FullName -NewName $($_.Name -replace "\s+")}
Из содержимого - так:
Код:

dir "C:\temp\folder\*.txt" |% {(gc $_) -replace "\s+" |sc $_}

serg515 22-10-2020 12:28 2937198

К сожалению ни один из вариантов ,не удаляет пробел (переход на следующую строку).

Foreigner 22-10-2020 12:56 2937200

Цитата:

Цитата serg515
не удаляет пробел (переход на следующую строку). »

Все содержимое в каждом файле надо без пробелов в одну строку?
Код:

foreach ($file in (Get-Childitem "C:\Folder\*.txt"))
{
    -join (Get-Content $file).Split() | Set-Content $file
}


serg515 22-10-2020 13:02 2937201

Цитата:

Цитата Foreigner
foreach ($file in (Get-Childitem "C:\Folder\*.txt"))
{
-join (Get-Content $file).Split() | Set-Content $file
} »

пробел текст пробел
пробел текст пробел
пробел текст пробел
пробел

надо:

текст
текст
текст

Foreigner 22-10-2020 13:27 2937202

Цитата:

Цитата serg515
надо: »

Уберите оператор -join
Код:

foreach ($file in (Get-Childitem "C:\Folder\*.txt"))
{
    (Get-Content $file).Split().Where{ $_ } | Set-Content $file
}


serg515 22-10-2020 13:52 2937203

Цитата:

Цитата Foreigner
Уберите оператор -join
Код:
foreach ($file in (Get-Childitem "C:\Folder\*.txt"))
{
(Get-Content $file).Split().Where{ $_ } | Set-Content $file
} »

не меняется.только в некоторых файлах в начале пробелы появляются.

Foreigner 22-10-2020 14:13 2937207

Цитата:

Цитата serg515
не меняется.только в некоторых файлах в начале пробелы появляются. »

Извиняюсь, неправильно понял:
Код:

foreach ($file in (Get-Childitem "C:\Folder\*.txt"))
{
    (Get-Content $file).Trim().Split().Where{ $_ } | Set-Content $file
}


serg515 22-10-2020 14:21 2937210

Цитата:

Цитата Foreigner
foreach ($file in (Get-Childitem "C:\Folder\*.txt"))
{
(Get-Content $file).Trim().Split().Where{ $_ } | Set-Content $file
} »

остаётся пробел перехода.в некоторых строках нарушается последовательность.

Uragan66 22-10-2020 14:46 2937213

Цитата:

Цитата serg515
остаётся пробел перехода.в некоторых строках нарушается последовательность. »

Код:

Foreach ($file in (Get-Childitem "C:\Folder\*.txt"))
{
    (Get-Content $file).Trim() | where {$_ -ne ""} | Set-Content $file
}


serg515 22-10-2020 15:00 2937215

Цитата:

Цитата Uragan66
Код:
Foreach ($file in (Get-Childitem "C:\Folder\*.txt"))
{
(Get-Content $file).Trim() | where {$_ -ne ""} | Set-Content $file
} »

тоже самое.

megaloman 22-10-2020 15:40 2937220

Код:

@Echo Off
        Set "Folder=Z:\Box_In"
        Set "Mask=*.*"
        FOR %%f IN ("%Folder%\%Mask%") DO (
                >"%%f.tmp" (FOR /F "usebackq delims=" %%s IN (`More "%%f"`) DO (
                        Set "SS=%%s"
                        (Call :MyOut "%%SS: =%%")
                ))
                >nul Move /Y "%%f.tmp" "%%f"
        )
Exit /B

:MyOut
        (If Not %1=="" Echo %~1)
Exit /B


serg515 22-10-2020 15:50 2937221

Цитата:

Цитата megaloman
Код:
@Echo Off
Set "Folder=Z:\Box_In"
Set "Mask=*.*"
FOR %%f IN ("%Folder%\%Mask%") DO (
>"%%f.tmp" (FOR /F "usebackq delims=" %%s IN (`More "%%f"`) DO (
Set "SS=%%s"
(Call :MyOut "%%SS: =%%")
))
>nul Move /Y "%%f.tmp" "%%f"
)
Exit /B
:MyOut
(If Not %1=="" Echo %~1)
Exit /B »


остаётся так же пробел (переход на новую строку).

Foreigner 22-10-2020 15:55 2937223

Цитата:

Цитата serg515
остаётся пробел перехода.в некоторых строках нарушается последовательность.»

Приложите файл. У меня все отрабатывает. Или вы имеете ввиду самый последний перевод строки?

Код:

foreach ($file in (Get-Childitem "C:\Folder\*.txt"))
{
    ((Get-Content $file).Trim().Split().Where{$_} | Out-String).Trim() | Set-Content $file -NoNewline
}


serg515 22-10-2020 16:00 2937224

Цитата:

Цитата Foreigner
Приложите файл. У меня все отрабатывает. Или вы имеете ввиду самый последний перевод строки? »

да.самый последний,переход на новую пустую строку.

DJ Mogarych 22-10-2020 16:50 2937231

Цитата:

Цитата serg515
пробел (переход на следующую строку) »

Это разные вещи.

serg515 22-10-2020 17:04 2937233

Цитата:

Цитата DJ Mogarych
Это разные вещи. »

возможно.хотя не все считают это не единым понятием,в т.ч. разработчики определённого сотфа.

DJ Mogarych 22-10-2020 20:57 2937249

serg515, дело не в том, как кто считает, а в постановке задачи, когда сначала непонятно, откуда убирать пробелы, а потом оказывается, что пробелами именуются и переводы строки.

Код:

dir "C:\temp\folder\*.txt" |% {(gc $_ -raw) -replace "\s+|`n" |sc $_}

serg515 22-10-2020 21:33 2937253

DJ Mogarych,
просто некоторые и переводы строки относят к пробелам.
шапку дополнил.

megaloman 22-10-2020 22:37 2937258

.vbs скрипт
Код:

MyDir = "Z:\Box_In"
MyMask = "^.*\..*$"

Set Reg = CreateObject("VBScript.RegExp")
Reg.IgnoreCase = True
Reg.Pattern = MyMask

With CreateObject("Scripting.FileSystemObject")
    Set Files = .GetFolder(MyDir).Files

    For Each File In Files
        Filename = File.Path
        If Reg.Test(Filename) Then
           
            Set fIn = .OpenTextFile(Filename, 1, False)
            On Error Resume Next
            Err.Number = 0
            InTxt = fIn.ReadAll
           
            If Err.Number = 0 Then
                fIn.Close
                InTxt = Replace(InTxt, " ", "")
                Mas = Split(InTxt, vbCrLf)
               
                iMax = -1
                For i = UBound(Mas) To LBound(Mas) Step -1
                    If Len(Mas(i)) <> 0 Then
                        iMax = i
                        Exit For
                    End If
                Next
                Set fIn = .CreateTextFile(Filename, True)
                fIn.Close
               
                Set fIn = .OpenTextFile(Filename, 8, False)
                If iMax >= 0 Then
                    For i = LBound(Mas) To iMax
                        If Len(Mas(i)) <> 0 Then
                            If i <> iMax Then
                                fIn.WriteLine Mas(i)
                            Else
                                fIn.Write Mas(i)
                            End If
                        End If
                    Next
                End If
                fIn.Close
            Else
                fIn.Close
            End If
            On Error GoTo 0
        End If
    Next
End With

MsgBox "Done"


greg zakharov 22-10-2020 23:25 2937261

Цитата:

Цитата serg515
просто некоторые и переводы строки относят к пробелам.

Кто например? Может вы путаете BRE [:space:] с пробелами?
Код:

sed -i.bak "s/[[:space:]]/\n/g" *.txt
Только вот тогда нужно иметь в виду, что POSIX [:space:] на самом деле BRE представление ASCII [ \t\r\n\v\f] (или в краткой записи - \s). В переводе на матерный русский это означает, что в том же ASCII пробел кодируется 32 чаром, а управляющая последовательность \n - 10.

serg515 23-10-2020 13:02 2937311

Цитата:

Цитата greg zakharov
Кто например? Может вы путаете BRE [:space:] с пробелами?
К »

например..
есть такой программный продукт zennoposter, там фичя,удаление пробелов.
так вот там удаление происходит, вместе с переводом строк.

Опиум 23-10-2020 16:46 2937331

Может проще уже консольную утилиту написать?

Код:

type вашфайл.txt | мояутилита.exe >идеальный_файл.txt

serg515 24-10-2020 16:02 2937420

Цитата:

Цитата megaloman
что не устроило в vbs- скрипте? Там вроде бы учтены все пожелания и не надо никаких добавочных средств. »

ваш скрипт сработал нормально.спс.


Время: 14:09.

Время: 14:09.
© OSzone.net 2001-