Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.97/63: Рейтинг темы: голосов - 63, средняя оценка - 4.97
0 / 0 / 0
Регистрация: 30.09.2011
Сообщений: 13
1

Удаление строк из текстового файла

10.12.2011, 10:00. Показов 11391. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет !
Есть текстовый файл где около 100 тыс. строк. Нужно с заданой строки удалить все строки которые шли до нее. Допустим задать 2500 строку и удалить все 2499 строк до нее.
Как можно это осуществить ? Если есть где-то ман по работе с текстом и строками, пожалуйста поделитесь ссылочкой.
Буду примного благодарен всем кто поможет

Добавлено через 13 часов 32 минуты
Весь google перерыл. Везде одна и та же статья по работе со строками, а то чего нужно нет
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.12.2011, 10:00
Ответы с готовыми решениями:

Удаление строк из текстового файла
Задача: есть текстовой файл(а) который содержит много текста допустим объявления. есть еще один...

Удаление строк из текстового файла
Добрый день! Помогите пожалуйста решить задачу: Есть текстовый файл с большим количеством...

Удаление из текстового документа строк, не удовлетворяющих условию
Доброго времени суток. Существует текстовый документ, содержащий большое количество строк (около...

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

18
969 / 71 / 9
Регистрация: 15.10.2011
Сообщений: 583
Записей в блоге: 1
10.12.2011, 10:26 2
1. Открыть файл на чтение.
2. Организовать перебор строк и поиск искомой строки
3. Если строка найдена, по произвести запись всех остальных строк в temp.txt
4. Удалить файл.
5. Переименовать temp.txt в ваш файл.
0
0 / 0 / 0
Регистрация: 30.09.2011
Сообщений: 13
10.12.2011, 10:40  [ТС] 3
Цитата Сообщение от Мастер Шифу Посмотреть сообщение
1. Открыть файл на чтение.
2. Организовать перебор строк и поиск искомой строки
3. Если строка найдена, по произвести запись всех остальных строк в temp.txt
4. Удалить файл.
5. Переименовать temp.txt в ваш файл.
читайте внимательно, прежде чем писать
0
44 / 22 / 2
Регистрация: 20.11.2008
Сообщений: 178
10.12.2011, 14:12 4
Цитата Сообщение от G4W2 Посмотреть сообщение
читайте внимательно, прежде чем писать
А собственно совет, то дельный, делаешь перебор по строкам символов так по 1025.
доходишь до нужного тебе номера и дальше с пункта 3.
0
112 / 78 / 30
Регистрация: 10.09.2011
Сообщений: 263
10.12.2011, 14:27 5
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var
st: TStringList;
i,n,k: integer; //счетчики (откуда удалять, докуда удалять)
begin
st:=TStringList.Create; //создаем компонент для работы со строками
st.LoadFormFile('mytext.txt'); // загружаем туда строки из файла
i:=StrToInt(Edit1.TExt);
n:=StrToInt(Edit2.TExt);
k:=i; // в n записываем строку, по которую нужно удалять
for i:=StrToInt(Edit1.TExt); to n do st.delete(k); // Удаляем строки
st.SAveTofile(mytext.txt); // сохраняем измененный текст в файл
st.Free; //убиваем компонент, что бы освободить память
end;
2
498 / 251 / 56
Регистрация: 16.06.2011
Сообщений: 904
10.12.2011, 14:34 6
Цитата Сообщение от dtsey Посмотреть сообщение
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
var
st: TStringList;
i,n,k: integer; //счетчики (откуда удалять, докуда удалять)
begin
st:=TStringList.Create; //создаем компонент для работы со строками
st.LoadFormFile('mytext.txt'); // загружаем туда строки из файла
i:=StrToInt(Edit1.TExt);
n:=StrToInt(Edit2.TExt);
k:=i; // в n записываем строку, по которую нужно удалять
for i:=StrToInt(Edit1.TExt); to n do st.delete(k); // Удаляем строки
st.SAveTofile(mytext.txt); // сохраняем измененный текст в файл
st.Free; //убиваем компонент, что бы освободить память
end;
При работе с файлом в 100 тыс строк думаю будут наблюдаться задержки.
Может использовать поток?!
0
112 / 78 / 30
Регистрация: 10.09.2011
Сообщений: 263
10.12.2011, 14:37 7
Цитата Сообщение от HyperZen Посмотреть сообщение
При работе с файлом в 100 тыс строк думаю будут наблюдаться задержки.
Может использовать поток?!
Очевидно. Но поток я писать не буду. Я предоставил алгоритм, все остальное - работа для ТС.
0
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
10.12.2011, 16:43 8
Цитата Сообщение от HyperZen Посмотреть сообщение
При работе с файлом в 100 тыс строк думаю будут наблюдаться задержки.
Может использовать поток?!
О чем вы говорите - при современных процессорах .У меня удалить все строки до миллионной - заняло 4 секунды.
И опять же потоки - это только эмуляция одновременной работы.Если в одном потоке +++++
а во втором ---------, то результат будет такой +-+-+-+-

G4W2, предложил нормальный вариант
А я хочу предложить свой
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var
List, List1: Tstringlist;
i,n,j: Integer;
begin
n:= StrtoInt(Edit1.Text);
List:= TStringList.Create;
List1:= TStringlist.Create;
List.LoadFromFile(ExtractFilePath(Application.ExeName)+'1.txt');
for I := 0 to n-1 do List.Strings[i]:= '';
for i := 0 to List.Count - 1 do
begin
 if List.Strings[i]<> '' then List1.Add(List.Strings[i]);
end;
 
 
List1.SaveToFile(ExtractFilePath(Application.ExeName)+'1.txt');
List.Free;
List1.Free;
end;
Так как в коде
dtsey, я заметил недочеты
во-первых если делать так то
Цитата Сообщение от HyperZen Посмотреть сообщение
for i:=StrToInt(Edit1.TExt); to n do st.delete(k); // Удаляем строки
удаляться будут не те строки(i увеличивается а число строк в st уменьшается - итог - удаляются не те строки)
во-вторых две описки


Цитата Сообщение от HyperZen Посмотреть сообщение
for i:=StrToInt(Edit1.TExt); to n do st.delete(k); // Удаляем строки
st.SAveTofile(mytext.txt); // сохраняем измененный текст в файл
точка с запятой в середине первой строки и название файла во второй строке без ' '

Добавлено через 9 минут
Алучше вообще так
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var
List, List1: Tstringlist;
i,n,j: Integer;
begin
n:= StrtoInt(Edit1.Text);
List:= TStringList.Create;
List1:= TStringlist.Create;
List.LoadFromFile(ExtractFilePath(Application.ExeName)+'1.txt');
 
for i := n to List.Count - 1 do
begin
  List1.Add(List.Strings[i]);
end;
 
 
List1.SaveToFile(ExtractFilePath(Application.ExeName)+'1.txt');
List.Free;
List1.Free;
end;
1
112 / 78 / 30
Регистрация: 10.09.2011
Сообщений: 263
10.12.2011, 17:01 9
igoriy, я писал код в брузере и был занят другим дело. Прощу прощения за недочеты.
0
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
10.12.2011, 17:09 10
понятно - у меня первый вариант примерно такой же был пока я не увидел
Цитата Сообщение от igoriy Посмотреть сообщение
удаляться будут не те строки(i увеличивается а число строк в st уменьшается - итог - удаляются не те строки)
0
112 / 78 / 30
Регистрация: 10.09.2011
Сообщений: 263
10.12.2011, 17:10 11
Цитата Сообщение от igoriy Посмотреть сообщение
понятно - у меня первый вариант примерно такой же был пока я не увидел
Просто я не тестировал программу
0
0 / 0 / 0
Регистрация: 30.09.2011
Сообщений: 13
10.12.2011, 21:53  [ТС] 12
Спасибо всем за помощь !
0
873 / 544 / 117
Регистрация: 24.11.2009
Сообщений: 1,329
16.12.2011, 05:52 13
вот код о котором вчера разговаривали
Delphi
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
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Button2: TButton;
    OpenDialog1: TOpenDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  Path: string;
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
begin
if OpenDialog1.Execute then Path:= OpenDialog1.FileName;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var
List, List1: Tstringlist;
i,n,j: Integer;
begin
n:= StrtoInt(Edit1.Text);
List:= TStringList.Create;
List1:= TStringlist.Create;
List.LoadFromFile(Path);
for i := n to List.Count - 1 do List1.Add(List.Strings[i]);
List1.SaveToFile(Path);
 
List.Free;
List1.Free;
end;
 
 
 
 
end.
и исходник
Вложения
Тип файла: rar Новая папка (2).rar (319.0 Кб, 62 просмотров)
1
0 / 0 / 0
Регистрация: 30.09.2011
Сообщений: 13
16.12.2011, 19:39  [ТС] 14
Спасибо
0
188 / 120 / 4
Регистрация: 23.01.2010
Сообщений: 1,320
06.09.2013, 10:09 15
Цитата Сообщение от igoriy Посмотреть сообщение
List.LoadFromFile(ExtractFilePath(Application.ExeName)+'1.txt');
Добрый день, ну вот никак мне не нравится эта строка, поскольку если файл допустим будет 8 gb то атупеет нето комп нето пользователь ждать пока файл загрузиться (опустим факт что таким способом не более 2 гб) но всеже если вы знаете способ более дельный то скажите как удалить из текстового файла с позиции n до позиции k без использования api.
0
Модератор
3490 / 2613 / 741
Регистрация: 19.09.2012
Сообщений: 7,974
06.09.2013, 10:25 16
Например, TFileStream.
0
Заблокирован
06.09.2013, 10:43 17
А зачем вообще циклы и прочая лабуда?
Ну сначала про тысячи строк... Подгружайте частями, найдёте нужное место, и тогда - вперёд.
А вперёд, это элементарное копирование потока. Да, это требует памяти. Но количество памяти и скорость всегда были конкурентами. Хотите скорость - гоните памяти побольше, хотите меньше памяти, готовьтесь к длительному процессу со свопингами.
Правда после того, как я связался с KOL я уже основательно подзабыл возможности файловых потоков в основном делфи. Но в KOL я делаю это так...
Открываю файловый поток. Частями загружаю в мемо, или куда там ещё, текст. Получаю позицию обрезки.
Потом открываю другой файловый поток. И копирую в него из первого потока с нужной позиции нужное количество данных. Операция эта хорошо оптимизирована, использует механизм буферизации, и проблем никаких.
Только сомневаюсь чтобы текст был хотя-бы на гиг.
Кстати, в KOL при записи из ричедит (не помню как с мемо) так же нужно определять позицию начала записи и количество записываемых данных. Так что, стоит положится на благоразумность и оптимальность кода записи и попросту, найдя место вырезки, произвести запись нового файла с этими параметрами.
0
188 / 120 / 4
Регистрация: 23.01.2010
Сообщений: 1,320
16.01.2014, 23:52 18
Цитата Сообщение от G4W2 Посмотреть сообщение
сем привет !
Есть текстовый файл где около 100 тыс. строк. Нужно с заданой строки удалить все строки которые шли до нее. Допустим задать 2500 строку и удалить все 2499 строк до нее.
Как можно это осуществить ? Если есть где-то ман по работе с текстом и строками, пожалуйста поделитесь ссылочкой.
Буду примного благодарен всем кто поможет
есть возможность удалять непосредственно из файла с позиции setfilepointer до n длинной байт и без всей этой лобуды которую предложили ниже.
0
пофигист широкого профиля
4733 / 3167 / 859
Регистрация: 15.07.2013
Сообщений: 18,252
17.01.2014, 01:35 19
Цитата Сообщение от n971030 Посмотреть сообщение
есть возможность удалять непосредственно из файла с позиции setfilepointer до n длинной байт и без всей этой лобуды которую предложили ниже.
А n байт это сколько строк?
0
17.01.2014, 01:35
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.01.2014, 01:35
Помогаю со студенческими работами здесь

Удаление записей из текстового файла
Всем доброго времени суток. Суть вот в чем - Дан типизированный файл для хранения информации о...

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

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

Чтение строк из текстового файла в memo
Привет. Как сделать чтобы при чтении строк из файла такого вида: 123 456,78 789 12,5 987 654...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru