Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/32: Рейтинг темы: голосов - 32, средняя оценка - 4.69
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37

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

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

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

аваппаапаапавааапв
корпорации Стив Баллмер.
Новые сообщения [разделы
> Компьютерный форум >
Нужно удалить только 6 символов (пробел это тоже символ) каждой строки
Получится так:
апаапавааапв
ации Стив Баллмер.
сообщения [разделы
ьютерный форум >
____________________________
Желательно что бы количество символов можно было задать опционально, хоть 128=)
П.С, количество строк не известно, в общем что бы скрипт работал до конца файла - до последней строки.
Спасибо
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.11.2012, 23:01
Ответы с готовыми решениями:

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

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

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

16
1781 / 763 / 130
Регистрация: 09.04.2011
Сообщений: 1,325
04.11.2012, 00:35
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
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
04.11.2012, 01:07  [ТС]
Не хочет работать

Добавлено через 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
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
04.11.2012, 01:59
Так и должно быть. У меня все работает.
Имя исходного файла правильно задано?
0
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
04.11.2012, 02:31  [ТС]
Файл 42мб, не работает!
С мелким файлом работает.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
04.11.2012, 03:28
Так может перейдем на 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
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
04.11.2012, 22:18  [ТС]
Dragokas Спасибо!
Сейчас буду проверять.
Я думаю вариант sov44 не работает из-за кодировки в текстовом файле.
sov44 всёравно спасибо!

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

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

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

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

Там действительно специфическая кодировка, некая UCS-2 Little Endian.
Буду работать с ней напрямую в бинарном режиме, без преобразований.
Там каждый символ закодирован 2 байтами.
Причем первые 2 байта - &HFF &HFE видимо задают идентификатор кодировки и должны быть опущены при обработке.
Перенос каретки организован стандатными Win-кодами &H0D &H0A, и тоже 2-байтовые,
тем не менее штатными средствами определяются нормально как новая строка.
1
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
11.11.2012, 03:27
В общем на 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 Кб, 16 просмотров)
1
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
11.11.2012, 17:38  [ТС]
Dragokas, Вы гений!
Спасибо Вам огромное!
Спасибо, побежала тестировать!
Могу скомпилировать в виде EXE-файла с возможностью передачи 2 входных параметров через командную строку (имен файлов).
Если Вас не затруднит.
А так попробую Сама скомпиллировать.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18033 / 7736 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
12.11.2012, 04:11
Скомпилированная программа в архиве.

Исходный код

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 Кб, 33 просмотров)
1
 Аватар для xinix
0 / 0 / 0
Регистрация: 28.09.2012
Сообщений: 37
12.11.2012, 12:10  [ТС]
Dragokas Спасибо
Я не знаю куда деться от счастья))
Спасибо!
Побежала тестировать!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2012, 12:10
Помогаю со студенческими работами здесь

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

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

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

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

Подсчет количества слов длиной 5 символов в текстовом файле
Составить код, которая подсчитывает количество слов в текстовом файле длина которых равна числу 5 &lt;?php $wordsCount =...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru