Форум
Написать нам
  • Страница 1 из 1
  • 1
Модератор форума: as-master  
Удаление строки из текстового файла
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 ответил уже... Ну ничего: мой вариант компактнее wink



Вечная память Андрею Сергееву!
 
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
ХА smile Это называется "мозговой штурм"! smile

P. S. Всё ранво мой круче wink Компактнее, в смысле. toizy, сдавайся! biggrin



Вечная память Андрею Сергееву!
 
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
Группа: Удаленные





Возьмите мой, возьмите!.. cry

Добавлено (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) Работает он хорошо, но если вы захотите удалить пустую строку, то сильно удивитесь... smile
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)

Или это неубранные остатки от первого варианта? smile

 
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, с возвращением! Вернул тебе твоё почётное звание wink Будь как дома! Как и был... Мы с as-master'ом как могли неплохую компанию собрали smile

За критику по скрипту - спасибо. Есть что доделать... sad



Вечная память Андрею Сергееву!
 
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
 
  • Страница 1 из 1
  • 1
Поиск: