Удаление строки из текстового файла
|
|
as-master | Дата: Суббота, 02 Декабря 2006, 18:21 | Сообщение # 1 |
Группа: Удаленные
| ИМЕЕТСЯ: 1. Небольшой текстовый файл, не более 20 строк (их количество заранее не известно) 2. Номер строки, которую нужно удалить - n. НЕОБХОДИМО: Удалить указанную строку из файла, и чтобы все строки ниже удаленной поднялись на строку вверх (то есть чтобы не осталось пустой строки). При этом необходимо, чтобы на месте бывшей последней строки, которая поднялась на одну вверх, больше не существовало пустой строки - то есть при открытии текста, например, в блокноте, курсор не опускался бы ниже последней строчки.
|
|
| |
toizy | Дата: Суббота, 02 Декабря 2006, 21:51 | Сообщение # 2 |
Группа: Удаленные
| Code | **Переменная ниже - номер удаляемой строки PosOfDelStr=2 **Заносим в переменную количество линий файла, чтобы не нагружать цикл вычислениями - **я не уверен, что ММВ не просчитывает такие веши каждый раз в цикле NumOfLines=NOL('C:\test.txt') **Ниже мы создаём результирующий файл заново, на случай, если он уже есть ReturnVal=StrToFile('C:\test2.txt','',FALSE,FALSE) **Цикл: For c=1 To NumOfLines **строка под номером c ReturnStr$=StrFromFile('C:\test.txt',c,1) If (c<>PosOfDelStr) Then **если с не равна номеру строки, которую надо удалить, то... ReturnVal=StrToFile('C:\test2.txt',ReturnStr$,TRUE,TRUE) End Next c **Все! |
|
|
| |
YURIY | Дата: Суббота, 02 Декабря 2006, 21:55 | Сообщение # 3 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Code | path$='ПУТЬ\ИМЯ_ФАЙЛА.txt' t=NOL(path$) Line$=StrFromFile(path$,1,t) Line1$=StrFromFile(path$,НОМЕР_СТРОКИ,1) Line1$=Line1$+CHR(13)+CHR( 10) Line$=StrChange(Line$,Line1$,'') RetVal=StrToFile(path$,Line$,FALSE,FALSE) | НОМЕР_СТРОКИ - это номер той строки, которую нужно удалить в файле path$. Добавлено (2006-12-02, 9:55 Pm) --------------------------------------------- Гм... Не знал, что toizy ответил уже... Ну ничего: мой вариант компактнее
Вечная память Андрею Сергееву!
|
|
| |
as-master | Дата: Суббота, 02 Декабря 2006, 22:29 | Сообщение # 4 |
Группа: Удаленные
| Оба варианта рабочие, спасибо ОГРОМНОЕ!!! Недостаток варианта toizy для меня - в том, что создается новый файл, а мне нужно в том же самом. Ошибка скрипта Юрия в том, что он НЕ УДАЛЯТ строку, если её номер является последним. Спасибо всем еще раз! Буду разбираться с вашими предложениями дальше.
|
|
| |
toizy | Дата: Суббота, 02 Декабря 2006, 22:40 | Сообщение # 5 |
Группа: Удаленные
| Code | PosOfDelStr=2 NumOfLines=NOL('C:\test.txt') ** Result$='' For c=1 To NumOfLines ReturnStr$=StrFromFile('C:\test.txt',c,1) If (c<>PosOfDelStr) Then If (c<NumOfLines) Then Result$=Result$+ReturnStr$+CHR(13)+CHR(10) Else Result$=Result$+ReturnStr$ End End Next c ReturnVal=StrToFile('C:\test.txt','',FALSE,FALSE) ReturnVal=StrToFile('C:\test.txt',Result$,TRUE,TRUE) |
|
|
| |
YURIY | Дата: Суббота, 02 Декабря 2006, 22:58 | Сообщение # 6 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| toizy, используй при вставке кода теги 'code'! Quote (as-master) | Ошибка скрипта Юрия в том, что он НЕ УДАЛЯТ строку,если её номер является последним. | Согласен: Code | path$='ПУТЬ\ИМЯ_ФАЙЛА.txt' t=NOL(path$) Line$=StrFromFile(path$,1,t) line=НОМЕР_СТРОКИ Line1$=StrFromFile(path$,line,1) If (line<>t) Then Line1$=Line1$+CHR(13)+CHR(10) Else Line1$=CHR(13)+CHR(10)+Line1$ End Line$=StrChange(Line$,Line1$,'') RetVal=StrToFile(path$,Line$,FALSE,FALSE) |
Вечная память Андрею Сергееву!
|
|
| |
as-master | Дата: Суббота, 02 Декабря 2006, 23:02 | Сообщение # 7 |
Группа: Удаленные
| Аж глаза разбегаются... Всё, беру оба! Заверните, плиз :)
|
|
| |
YURIY | Дата: Суббота, 02 Декабря 2006, 23:06 | Сообщение # 8 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| ХА Это называется "мозговой штурм"! P. S. Всё ранво мой круче Компактнее, в смысле. toizy, сдавайся!
Вечная память Андрею Сергееву!
|
|
| |
as-master | Дата: Воскресенье, 03 Декабря 2006, 11:02 | Сообщение # 9 |
Группа: Удаленные
| Юрий, признаю твой скрипт полностью работоспособным и пригодным для использования в моём проекте. Thanks!!!
|
|
| |
toizy | Дата: Воскресенье, 03 Декабря 2006, 11:10 | Сообщение # 10 |
Группа: Удаленные
| Да и я тут, кстати, улучшил свой вариант: Code | PosOfDelStr=2 NumOfLines=NOL('C:\test.txt') Result$='' For c=1 To NumOfLines ReturnStr$=StrFromFile('C:\test.txt',c,1) If (c<>PosOfDelStr) Then If (Result$<>'') Then Result$=Result$+CHR(13)+CHR(10)+ReturnStr$ Else Result$=ReturnStr$ End End Next c ReturnVal=StrToFile('C:\test.txt','',FALSE,FALSE) ReturnVal=StrToFile('C:\test.txt',Result$,TRUE,TRUE) |
|
|
| |
as-master | Дата: Воскресенье, 03 Декабря 2006, 11:14 | Сообщение # 11 |
Группа: Удаленные
| toizy, твой тоже обязательно проверю. Просто я сначала Юрию заявлял, что его скрипт глючит. А оказалось, что был неправ. Если работоспособны оба ваших скрипта, то мне трудно определить, какой лучше, в смысле экономичнее по отношению к памяти компа.
|
|
| |
toizy | Дата: Воскресенье, 03 Декабря 2006, 11:20 | Сообщение # 12 |
Группа: Удаленные
| Возьмите мой, возьмите!.. Добавлено (2006-12-03, 11:20 Am) --------------------------------------------- А какая память? Это ж не ассемблер, это всго лишь ММВ... Quote (as-master) | Если работоспособны оба ваших скрипта, то мне трудно определить, какой лучше, в смысле экономичнее по отношению к памяти компа. | А не к тому, просто я люблю циклы и рекурсию. А предыдущий мой скрипт работал неправильно потому, что: If (c<>PosOfDelStr) Then - это если c не равен PosOfDelStr If (c<NumOfLines) Then - это если с меньше PosOfDelStr Result$=Result$+ReturnStr$+CHR(13)+CHR(10) Else Result$=Result$+ReturnStr$ - а это - если с равен PosOfDelStr, но написано же выше, что в этом условии с не должен быть равен PosOfDelStr! End End Я сам с себя балдею, блин!
|
|
| |
as-master | Дата: Воскресенье, 03 Декабря 2006, 11:55 | Сообщение # 13 |
Группа: Удаленные
| Теперь твой скрипт работает безупречно. Рекомендую всем оба варианта - твой и Юрия. Кому какой нравится :)
|
|
| |
Rush | Дата: Вторник, 05 Декабря 2006, 17:44 | Сообщение # 14 |
Обозреватель-консультант
Группа: Проверенные
Сообщений: 216
Репутация: 10
Награды: 1
Статус: Offline
| Ну братцы, понравились мне ваши скрипты и сам я Андрею заслал. А потом решил их погонять. И вот что можно сказать: Скрипт toizy работает безупречно. Класс! Честно скажу - у меня мысль в этом плане (цикла) даже не срослась, копал в других направлениях. А сейчас, когда я погонял и ваши, и свой скрипт на баги - могу ответственно заявить - метод с циклом самый экономный и правильный. Единственно, что бы можно добавить - для полной универсальности - это удаление последней пустой строки. Что-то, типа, вот так: PosOfDelStr=6 NumOfLines=NOL('C:\test.txt') Result$='' For c=1 To NumOfLines ReturnStr$=StrFromFile('C:\test.txt',c,1) If (c=NumOfLines & ReturnStr$='') Then Break() End If (c<>PosOfDelStr) Then If (Result$<>'') Then Result$=Result$+CHR(13)+CHR(10)+ReturnStr$ Else Result$=ReturnStr$ End End Next c ReturnVal=StrToFile('C:\test.txt','',FALSE,FALSE) ReturnVal=StrToFile('C:\test.txt',Result$,TRUE,TRUE) А по поводу Юриного скрипта: 1) Работает он хорошо, но если вы захотите удалить пустую строку, то сильно удивитесь... 2) Если будет в файле несколько одинаковых строк - удалятся все... И напоследок, пробуя разные варианты, обнаружил - если в одном скрипте использовать StrToLine и StrToFile, после того как заменишь ПЕРВУЮ строку, начинает глючить StrToFile. У меня, по крайней мере. Задаешь параметры StrToFile append - 0, linefeed - 0, но текст не заменяется, а добавляется. Но самое интересное - если вывести StrToLine в отдельный скрипт, а из этого его запустить - все нормально. Добавлено (2006-12-05, 5:44 Pm) --------------------------------------------- Да, совсем забыл спросить - зачем нужны ReturnVal=StrToFile('C:\test.txt','',FALSE,FALSE) ReturnVal=StrToFile('C:\test.txt',Result$,TRUE,TRUE) когда достаточно ReturnVal=StrToFile('C:\test.txt',Result$,0,0) Или это неубранные остатки от первого варианта?
|
|
| |
toizy | Дата: Вторник, 05 Декабря 2006, 22:14 | Сообщение # 15 |
Группа: Удаленные
| Quote (Rush) | Или это неубранные остатки от первого варианта? | Сорри за невнимательность!Добавлено (2006-12-05, 10:14 Pm) --------------------------------------------- А за замечание по поводу проверки на пустую строку - спасибо!
|
|
| |
YURIY | Дата: Среда, 06 Декабря 2006, 12:17 | Сообщение # 16 |
Злостный админ
Группа: Администраторы
Сообщений: 3018
Репутация: 71
Награды: 28
Статус: Offline
| Rush, с возвращением! Вернул тебе твоё почётное звание Будь как дома! Как и был... Мы с as-master'ом как могли неплохую компанию собрали За критику по скрипту - спасибо. Есть что доделать...
Вечная память Андрею Сергееву!
|
|
| |
dronet | Дата: Понедельник, 27 Августа 2007, 04:48 | Сообщение # 17 |
Любопытный
Группа: Проверенные
Сообщений: 38
Репутация: 0
Награды: 0
Статус: Offline
| А можно ли за место (PosOfDelStr=2) указать начало строки, если я знаю что она начинаетса с ( [B]Слово: ) дальше текст нейзвестен Я конечно не уверен, но может воможно? Что-то вроде этого мне некак не понять. string$='[B]Слово:' count=LEN(string$) ** Определение числа символов For i=1 To count ** Создание цикла от 1 до числа символов
Andress
Сообщение отредактировал dronet - Понедельник, 27 Августа 2007, 17:32 |
|
| |
toizy | Дата: Понедельник, 27 Августа 2007, 22:55 | Сообщение # 18 |
Студийная субстанция
Группа: Администраторы
Сообщений: 2309
Репутация: 29
Награды: 12
Статус: Offline
| Quote (dronet) указать начало строки, если я знаю что она начинаетса с pos() в помощь
Жизнь оказалась не такой уж и забавной, как поначалу...
|
|
| |
dronet | Дата: Вторник, 28 Августа 2007, 00:46 | Сообщение # 19 |
Любопытный
Группа: Проверенные
Сообщений: 38
Репутация: 0
Награды: 0
Статус: Offline
| Quote (toizy) pos() в помощь Ну это - то да, этим я и пользуюсь, на форуме раскопал. Тут он загружает отрывок из Text.txt в RetString filename$='C:\Text.txt' ** crlf$=CHR(13)+CHR(10) txtfind$='[B]Слово:' txt$=StrFromFile(filename$,1,-1) len=LEN(txt$) pos=POS(txtfind$, txt$) txt$=StrDel(txt$, pos, len) NumOfLines1=GetArrayNum(txt$,crlf$)+1 ** NumOfLines2=20 RetString$=StrFromFile(filename$,NumOfLines1,NumOfLines2) LoadText("RetStr ing","RetString$") А вот я не могу понять в этих скриптах что вначале стоят, не разобрать что нужно добавить к моему скрипту. Я знаю слово из текста, я узнал на какой позиции он расположен, и далее мне надо эту позицию (строчку удалить) и чтобы все строчки находяшиеся ниже удаленной поднялись
Andress
Сообщение отредактировал dronet - Вторник, 28 Августа 2007, 00:48 |
|
| |