0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
1

Удаление определённого количества символов каждой строки в текстовом файле

03.11.2012, 23:01. Показов 5409. Ответов 16
Метки нет (Все метки)

Добрый вечер Уважаемые Гуру!
Задача:
Есть txt файл.
Нужно удалить определённое количество символов в каждой строке.
Пример:
txt файл содержит

аваппаапаапавааапв
корпорации Стив Баллмер.
Новые сообщения [разделы
> Компьютерный форум >
Нужно удалить только 6 символов (пробел это тоже символ) каждой строки
Получится так:
апаапавааапв
ации Стив Баллмер.
сообщения [разделы
ьютерный форум >
____________________________
Желательно что бы количество символов можно было задать опционально, хоть 128=)
П.С, количество строк не известно, в общем что бы скрипт работал до конца файла - до последней строки.
Спасибо
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.11.2012, 23:01
Ответы с готовыми решениями:

Удаление определённого количества первых символов в каждой строке текстового файла
Здравствуйте, подскажите пожалуйста. Имеется текстовый файл, в котором на каждой строке что-то...

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

Удаление определенного количества символов от края строки
Ребята, подскажите наиболее правильный способ решения задачки. Есть переменная, в нее сохраняется...

Чтение определенного количества строк в минуту и добавление данных в файле вывода для каждой строки
Добрый день форумчане и его жители. В данный момент у меня есть код, который делает query URL с...

16
1776 / 758 / 130
Регистрация: 09.04.2011
Сообщений: 1,325
04.11.2012, 00:35 2
xinix, пробуйте:
Bash
1
2
3
4
5
6
7
8
9
10
@echo off
SetLocal enabledelayedexpansion
set File=1.txt
set nn=6
set Out=out.txt
 
For /F "usebackq delims=" %%A In ("%File%") Do (
    Set "String=%%A"& Set "String=!String:~%nn%!"
    Echo.!String!>>%out%
    )
1
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
04.11.2012, 01:07  [ТС] 3
Не хочет работать

Добавлено через 7 минут
Bash
Q:\>SetLocal enabledelayedexpansion
 
Q:\>set File=1.txt
 
Q:\>set nn=6
 
Q:\>set Out=out.txt
 
Q:\>For /F "usebackq delims=" %A In ("1.txt") Do (Set "String=%A"  & Set "String
=!String:~6!"
 Echo.!String!1>>out.txt )
 
Q:\>pause
Для продолжения нажмите любую клавишу . . .

Мелькнёт и всё!
0
Эксперт WindowsАвтор FAQ
17840 / 7575 / 889
Регистрация: 25.12.2011
Сообщений: 11,316
Записей в блоге: 17
04.11.2012, 01:59 4
Так и должно быть. У меня все работает.
Имя исходного файла правильно задано?
0
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
04.11.2012, 02:31  [ТС] 5
Файл 42мб, не работает!
С мелким файлом работает.
0
Эксперт WindowsАвтор FAQ
17840 / 7575 / 889
Регистрация: 25.12.2011
Сообщений: 11,316
Записей в блоге: 17
04.11.2012, 03:28 6
Так может перейдем на VBS?

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

Добавлено через 52 минуты
Сохранить в файл с расширением .VBS

Классика:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Const ForReading = 1, ForWriting = 2, ForAppending = 8
 
Dim FSO, FileIn, FileOut, TextStream, CutN, SourceFile, ResultFile
 
SourceFile = "h:\1\in.txt"
ResultFile = "h:\1\out.txt"
CutN = 6
 
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FileIn = FSO.GetFile(SourceFile)
Set FileOut = FSO.OpenTextFile(ResultFile, ForWriting, True) 'True - создать файл, если не существует
Set TextStream = FileIn.OpenAsTextStream(1)
 
With TextStream
    While Not .AtEndOfStream
        FileOut.Writeline Mid(.ReadLine(), CutN + 1)
    Wend
    .Close
    FileOut.Close
End With
 
Set TextStream = Nothing: Set FileIn = Nothing: Set FileOut = Nothing: Set FSO = Nothing
Если напрягают символы переноса каретки в конце результирующего файла,
вот моя переделка:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Const ForReading = 1, ForWriting = 2, ForAppending = 8
 
Dim FSO, FileIn, FileOut, TextStream, CutN, SourceFile, ResultFile, St
 
SourceFile = "h:\1\in.txt"
ResultFile = "h:\1\out.txt"
CutN = 6
 
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FileIn = FSO.GetFile(SourceFile)
Set FileOut = FSO.OpenTextFile(ResultFile, ForWriting, True) 'True - создать файл, если не существует
Set TextStream = FileIn.OpenAsTextStream(1)
 
With TextStream
    Do While Not .AtEndOfStream
        St = .ReadLine()
        If .AtEndOfStream Then
            FileOut.Write Mid(St, CutN + 1)
          Else
            FileOut.Writeline Mid(St, CutN + 1)
        End If
    Loop
    .Close
    FileOut.Close
End With
 
Set TextStream = Nothing: Set FileIn = Nothing: Set FileOut = Nothing: Set FSO = Nothing
1
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
04.11.2012, 22:18  [ТС] 7
Dragokas Спасибо!
Сейчас буду проверять.
Я думаю вариант sov44 не работает из-за кодировки в текстовом файле.
sov44 всёравно спасибо!

Добавлено через 9 минут
Dragokas
Не работает, только как то странно меняет шрифт=)
И добовляет в некоторых местах проблелов перед строкой
И в конце каждой строки: пробел квадратик пробел.
И не удаляет символы.
Я поставила CutN = 14, но ничего не изменилось а только стало странно выглядеть

Добавлено через 1 минуту
txt файлв в юникоде, если это поможет.

Добавлено через 2 часа 26 минут
Мне нельзя файл в Анси конвертировать!
Только Юникод.
0
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
06.11.2012, 07:53  [ТС] 8
Серьёзно - не работает!
0
1776 / 758 / 130
Регистрация: 09.04.2011
Сообщений: 1,325
06.11.2012, 09:13 9
Цитата Сообщение от xinix Посмотреть сообщение
Мне нельзя файл в Анси конвертировать!
Только Юникод.
С этого бы и начали. для понятия, что хочется, выложите (во вложении) исходный и конечный файлы. Сторонние утилиты приветствуются?
1
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
08.11.2012, 16:36  [ТС] 10
Цитата Сообщение от sov44 Посмотреть сообщение
С этого бы и начали. для понятия, что хочется, выложите (во вложении) исходный и конечный файлы. Сторонние утилиты приветствуются?
Добрый вечер!
Простите не могла ответить(
Сторонние утилиты приветствуются
Вложения
Тип файла: txt 1.txt (190 байт, 29 просмотров)
Тип файла: txt 2.txt (142 байт, 19 просмотров)
0
1776 / 758 / 130
Регистрация: 09.04.2011
Сообщений: 1,325
08.11.2012, 18:17 11
xinix, наверное ничем не помогу. Пробовал кодировать утилитой win_iconv.exe, но похоже она не обрабатывает уникод (CP1200 (UTF-16LE + BOM))
1
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
10.11.2012, 10:45  [ТС] 12
sov44, Спасибо что попробовали!

Возможно Dragokas мне поможет...
0
Эксперт WindowsАвтор FAQ
17840 / 7575 / 889
Регистрация: 25.12.2011
Сообщений: 11,316
Записей в блоге: 17
11.11.2012, 01:30 13
Да, я тоже вслед за sov44 попробовал утилитой iConv, но она не справилась с последовательностью.
Речь не только в том, чтобы превратить в читаемую скриптом форму, но надо еще и вернуть обратно в том же виде.

Там действительно специфическая кодировка, некая UCS-2 Little Endian.
Буду работать с ней напрямую в бинарном режиме, без преобразований.
Там каждый символ закодирован 2 байтами.
Причем первые 2 байта - &HFF &HFE видимо задают идентификатор кодировки и должны быть опущены при обработке.
Перенос каретки организован стандатными Win-кодами &H0D &H0A, и тоже 2-байтовые,
тем не менее штатными средствами определяются нормально как новая строка.
1
Эксперт WindowsАвтор FAQ
17840 / 7575 / 889
Регистрация: 25.12.2011
Сообщений: 11,316
Записей в блоге: 17
11.11.2012, 03:27 14
В общем на VBS не получилось. Там куча заморочек с приведениями типов массива.

На Visual Basic (компилируемій язык) все работает замечательно.
Вот код:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
Option Explicit
 
Sub Main()
Dim VarByte, SrcFile$, outFile$, n&, sz&, C&, nC&, WRpos&
'Скрипт удаления "C"-го кол-ва символов слева в каждой строке
'текстовых файлов с кодировкой Unicode
C = 1
 
'Настроен на кодировку UCS-2 Little Endian (начальные байты &HFF &HFE)
 
'Исходный файл
SrcFile = "z:\1\Bash\Xinix\1.txt"
'Результирующий (могут совпадать)
outFile = "z:\1\Bash\Xinix\ret.txt"
 
With CreateObject("ADODB.Stream")
    .Type = 1 'adTypeBinary
    .Open
    .LoadFromFile (SrcFile)
    sz = .Size
    VarByte = .Read(sz)
    .Close
    
    'Защита от неизвестного типа кодировки
    If VarByte(0) <> 255 Or VarByte(1) <> 254 Then
        If MsgBox("Кодировка файла отличается. Продолжаем?", vbYesNo) = vbNo Then Exit Sub
    End If
    
    WRpos = 2
    nC = C
    For n = 2 To sz - 1 Step 2
        If nC = 0 Then
            VarByte(WRpos) = VarByte(n)
            VarByte(WRpos + 1) = VarByte(n + 1)
            WRpos = WRpos + 2
          ElseIf VarByte(n) = 13 Then
            VarByte(WRpos) = 13
            VarByte(WRpos + 1) = 0
            VarByte(WRpos + 2) = 10
            VarByte(WRpos + 3) = 0
            WRpos = WRpos + 4
            n = n + 2
            nC = C
          Else
            nC = nC - 1
        End If
        If VarByte(n) = 10 Then nC = C
    Next n
    
    ReDim Preserve VarByte(WRpos - 1)
    .Open
    .Write VarByte
    .SaveTofile outFile, 2 '2 - перезаписать, если существует
    .Close
End With
End Sub
Этот код нужно скопировать в среду Visual Basic и скомпилировать,
либо в документ MS Office.

Могу скомпилировать в виде EXE-файла с возможностью передачи 2 входных параметров через командную строку (имен файлов).

Алгоритм работы:
Файл целиком читается в память (массив) в виде бинарной информации.
Проверяет первые 2 байта. Если не совпадают с кодировкой, выдается предупреждение.
Далее идет работа с массивом.
Идет просмотр счетчика пропускаемых символов.
Если символ не пропускается, он записывается в позицию записи WRpos в массиве.
То есть информация смещается вначало массива байтов.
Смещение идет не по цепочке, а в порядке чтения. Т.о. скорость достигается оптимальная.
В конце массив урезается до последней позиции записи.
Затем записывается в файл outFile.
Вложения
Тип файла: xls Binary_Text_Modify.xls (37.0 Кб, 13 просмотров)
1
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
11.11.2012, 17:38  [ТС] 15
Dragokas, Вы гений!
Спасибо Вам огромное!
Спасибо, побежала тестировать!
Могу скомпилировать в виде EXE-файла с возможностью передачи 2 входных параметров через командную строку (имен файлов).
Если Вас не затруднит.
А так попробую Сама скомпиллировать.
0
Эксперт WindowsАвтор FAQ
17840 / 7575 / 889
Регистрация: 25.12.2011
Сообщений: 11,316
Записей в блоге: 17
12.11.2012, 04:11 16
Скомпилированная программа в архиве.

Исходный код

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
Option Explicit
 
'Скрипт удаления "C"-го кол-ва символов слева в каждой строке
'текстовых файлов с кодировкой Unicode
'Настроен на кодировку UCS-2 Little Endian (начальные байты &HFF &HFE)
Sub Main()
Dim VarByte, SrcFile$, outFile$, n&, sz&, C&, nC&, WRpos&, argv
 
argv = Parse_CMDLine(Command)
 
'Проверка аргументов
If TypeName(argv) = "Empty" Then Call Using
If UBound(argv) < 1 Then Call Using 'если задан только 1 аргумент (argv(0))
C = Int(Val(argv(0))) 'Кол-во удаляемых символов
If C < 1 Then Call Using
If Dir$(argv(1)) = "" Then MsgBox "Файл " & argv(1) & " не найден!": End
'Исходный файл
SrcFile = argv(1)
'Результирующий (могут совпадать)
If UBound(argv) = 1 Then 'если 2-й параметр не задан
    outFile = SrcFile
  Else
    outFile = argv(2)
End If
 
With CreateObject("ADODB.Stream")
    .Type = 1 'adTypeBinary
    .Open
    .LoadFromFile (SrcFile)
    sz = .Size
    VarByte = .Read(sz)
    .Close
    
    'Защита от неизвестного типа кодировки
    If VarByte(0) <> 255 Or VarByte(1) <> 254 Then
        If MsgBox("Кодировка файла отличается. Продолжаем?", vbYesNo) = vbNo Then Exit Sub
        On Error Resume Next
    End If
    
    WRpos = 2
    nC = C
    For n = 2 To sz - 1 Step 2
        If nC = 0 Then
            VarByte(WRpos) = VarByte(n)
            VarByte(WRpos + 1) = VarByte(n + 1)
            WRpos = WRpos + 2
          ElseIf VarByte(n) = 13 Then
            VarByte(WRpos) = 13
            VarByte(WRpos + 1) = 0
            VarByte(WRpos + 2) = 10
            VarByte(WRpos + 3) = 0
            WRpos = WRpos + 4
            n = n + 2
            nC = C
          Else
            nC = nC - 1
        End If
        If VarByte(n) = 10 Then nC = C
    Next n
    
    ReDim Preserve VarByte(WRpos - 1)
    .Open
    .Write VarByte
    .SaveToFile outFile, 2 '2 - перезаписать, если существует
    .Close
End With
End Sub
 
 
Function Parse_CMDLine(st$)
Dim Lex, nL&, nA&, Unit$
If Len(st) = 0 Then Exit Function
 
Lex = Split(st)
ReDim argv(0 To UBound(Lex))
 
Do While nL <= UBound(Lex)
    Unit = Lex(nL)
    If Len(Unit) = 0 Then GoTo nxt 'Защита от двойных пробелов между параметрами
    If Left$(Lex(nL), 1) = """" Then
        Do Until Right$(Lex(nL), 1) = """"
            nL = nL + 1
            If nL > UBound(Lex) Then Exit Do
            Unit = Unit & " " & Lex(nL)
        Loop
        Unit = Replace$(Unit, """", "")
    End If
    argv(nA) = Unit
    nA = nA + 1
nxt:
    nL = nL + 1
Loop
If nA = 0 Then Exit Function
ReDim Preserve argv(0 To nA - 1)
Parse_CMDLine = argv
End Function
 
 
Private Sub Using()
Dim Txt$
      Txt = "Утилита удаления указанного количества символов" + vbCrLf
Txt = Txt + "с левого края текстовых файлов с кодировкой Unicode" + vbCrLf
Txt = Txt + vbCrLf
Txt = Txt + App.EXEName + " [n] [FileName1] {FileName2}" + vbCrLf
Txt = Txt + vbCrLf
Txt = Txt + "[n] - Число отсекаемых символов" + vbCrLf
Txt = Txt + "[FileName1] - Имя обрабатываемого файла" + vbCrLf
Txt = Txt + "[FileName2] - Имя файла, куда записывается результат" + vbCrLf
Txt = Txt + vbCrLf
Txt = Txt + "FileName2 - необязательный параметр. Если опущен, то результат перезаписывается в исходный файл." + vbCrLf
Txt = Txt + vbCrLf
Txt = Txt + "Примеры использования:" + vbCrLf
Txt = Txt + App.EXEName + " 3 file1.txt" + vbCrLf
Txt = Txt + App.EXEName + " 3 ""file 1.txt"" file2.txt" + vbCrLf
Txt = Txt + App.EXEName + " 3 c:\temp\file1.txt ""c:\my folder\file2.txt"""
MsgBox Txt, vbOKOnly + vbInformation, "Использование"
End
End Sub


А вот сам процесс работы над кодировкой
Вложения
Тип файла: zip nTRIM.zip (6.2 Кб, 30 просмотров)
1
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
12.11.2012, 12:10  [ТС] 17
Dragokas Спасибо
Я не знаю куда деться от счастья))
Спасибо!
Побежала тестировать!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.11.2012, 12:10
Помогаю со студенческими работами здесь

В текстовом файле f1 длина каждой строки не более 80 символов. Сформировать файл f2 таким образом, чтобы было 80 символ
В текстовом файле f1 длина каждой строки не более 80 символов. Сформировать файл f2 таким образом,...

Удаление определенного количества символов
Здравствуйте, товарищи программисты! Пришел сюда за вашей помощью =) Мне нужно сделать удаление...

Подсчет количества символов русского алфавита в текстовом файле
Здравствуйте, нужна ваша помощь) Допустим у нас имеется текстовой файл Test.txt( в нем находятся...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru