Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.135.86] |
|
Страницы: (3) [1] 2 3 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
В текстовом файле список строк:
User1 + User2 = 250 s\c User3 + User4 = 228 s\c User5 + User6 = 214 s\c Вопрос \ который интересует: Два варианта: Как удалить из текстового файла, указанные в Memo, буквы или слова до знака "=" Как удалить из текстового файла, указанные в Memo, буквы или слова после знака "=" Мой код делает удаление по всей строке: var Files_1,Files_2:TextFile; s:string; dl: TStringList; i: integer; begin \\\\\\\\\\\\\ В цикле берутся (слова или буквы которые нужно удалить) из memo12 dl := TStringList.Create; for i := 0 to Memo12.Lines.Count - 1 do dl.Add(Memo12.Lines[i]); \\\\\\\\\\\\\\\\ while not Eof(Files_1) do begin Readln(Files_1, s); // Тут проверяю строку целиком [Вот как удалять из строки до символа '=' и после символа '='] for i := 0 to dl.Count - 1 do begin s := StringReplace(s, dl[i], '', [rfReplaceAll, rfIgnoreCase]); end; Writeln(Files_2, s); end; Как вариант, можно разделить строку на две по знаку =, потом в каждой полученной строке удалить то, что нужно, а потом почищенные строки склеить снова, не забыв знак = между ними. Но это очень неудобно. Подскажите более правильный вариант ? |
Сообщ.
#2
,
|
|
|
1вариант) Самый быстрый (наверняка так): найти знак равенства, скопировать всё последующее (или равное самому знаку) в начало строки.
Пара "подводных камней": А) Если знаков '=' несколько, то условие нечёткое (т.е. неоднозначно понимаемое); Б) Если знак '=' установлен почти в начале строки, то копирование придётся вести посимвольное, что снизит скорость. Добавлено Кратко: strchr + memmove. |
Сообщ.
#3
,
|
|
|
Славян, Пока что тоже думаю но идей реализации (хороших, нет у меня).
|
Сообщ.
#4
,
|
|
|
Цитата Славян @ Цитата Kirilis2018 @ Кратко: strchr + memmove. буквы или слова до знака "=" Сложновато будет(откуда memmove). Легче так: Определение позиции знака "=" юзать pos('=',s) Удаления части строки - delete(s, начало, количество) Определение длины строки - length(s) |
Сообщ.
#5
,
|
|
|
Руслан, Если не сложно, простой пример можете набросать ?
|
Сообщ.
#6
,
|
|
|
Руслан, это всё (написанное вами) - весьма высокоуровневые операции. Длина же строки вообще мне видится ненужным вызовом. Так что таким путём, бесспорно, можно идти, но можно для скорости и низкоуровнево пошаманить...
|
Сообщ.
#7
,
|
|
|
Цитата Kirilis2018 @ [Вот как удалять из строки до символа '=' и после символа '='] удалить до символа = delete(s, 1, pos('=',s)); или удалить после символа = tmpPos:=pos('=',s);//var tmpPos:integer; delete(s, tmpPos, length(s)-tmpPos+1); |
Сообщ.
#8
,
|
|
|
Грубая схема выглядит так:
be, p : Pointer; be := Pointer(s); // адрес начала строки s, сюда начнём кидать новые буквы p := Pos( '=', s); // адрес первого знака равенства do be[0] := p[0], inc(be), inc(p) while( p[0]<>0 ); // кидаем буквы пока конец строки (0) не встретится be[0] := 0; // ставим знак конца строки |
Сообщ.
#9
,
|
|
|
Цитата Славян @ но можно для скорости и низкоуровнево пошаманить Если человеку сложно простые операции на высоком уровне выполнять, низкий уровень(и всякие загадочные pointer ) мне кажется для него не лучший вариант, получится как в той песне |
Сообщ.
#10
,
|
|
|
Руслан,Славян, Ребята спасибо что уделили время, буду пробовать, может что и получится...
|
Сообщ.
#11
,
|
|
|
Цитата Kirilis2018 @ Ребята спасибо что уделили время, буду пробовать, может что и получится... Всё получится! Ещё, если на самом деле тебе нужно использовать обе части от разделителя "=", желательно задействовать Copy(s, начиная_от, кол-во_символов); |
Сообщ.
#12
,
|
|
|
Цитата Руслан @ В целом, полностью с вами согласен. Замечу только лишь, что применение "высокоуровневых действий" больше похоже на заучивание непонятных правил; в то время как понимание "низкоуровневых" способно будет (медленно, но верно) набросать решение множества задач.Если человеку сложно простые операции на высоком уровне выполнять, низкий уровень(и всякие загадочные pointer ) мне кажется для него не лучший вариант, получится Но, честно говоря, ждут от Kirilis2018 наверняка ваш способ-путь, Руслан. |
Сообщ.
#13
,
|
|
|
Цитата Славян @ применение "высокоуровневых действий" больше похоже на заучивание непонятных правил; в то время как понимание "низкоуровневых" способно будет (медленно, но верно) набросать решение множества задач. Понимаю и в целом поддерживаю вашу концепцию, но все же нахожу актуальным метод "от простого к сложному". Высокий уровень изначально должен являться инструментом для упрощения программирования, и в большинстве случаев таковым является. Изучив высокий уровень, научившись решать на нем поставленные задачи, индивид может пойти по пути само-совершенствования (в итоге обретя умение строить более оптимизированные инструменты, фактически улучшать высокий уровень). Является ли использование справочника - "заучиванием непонятных правил"? - вроде бы нет. Собрать из предложенных функций код - дело не сложное, но требующее умения заюзать язык программирования. Ну а более глубокое изучение структур информации в памяти эвм, рассмотрение инструментов для работы с ними - полагаю в следующей главе этой увлекательной истории. |
Сообщ.
#14
,
|
|
|
Цитата Руслан @ Да, полностью согласен! нахожу актуальным метод "от простого к сложному". Цитата Руслан @ Именно! И упрощение подразумевает, что человек уже хорошо знает мелочи, составные части, но ему надоело каждый раз ими заниматься и он решает написать много разных процедур, функций, чтобы вызовы их заменили кучу простого. Так и появляются Pos, length, delete, ...Высокий уровень изначально должен являться инструментом для упрощения программирования Цитата Руслан @ А я всегда думал, что это в каком-то начале-прологе... более глубокое изучение структур информации в памяти эвм, рассмотрение инструментов для работы с ними - полагаю в следующей главе этой увлекательной истории. |
Сообщ.
#15
,
|
|
|
Руслан,
Славян, У меня вот получилось вот такое извращение склепать. Работает но медленно как черепаха, даже на файле в 1 мегабайт (10 минут обработки) - Жесть!: // Удаляет из текстового файла до знака "=" (Все буквы, слова что указанны в memo3) // Удаление из текстового файла после знака "=" (Все буквы, слова что указанны в memo4) Но скорость просто ужас - ПОМОГИТЕ ОПТИМИЗИРОВАТЬ! procedure Working(_L1, _L2: TStrings; Mode: boolean); var i, j: integer; s: String; begin for i := 0 to _L1.Count - 1 do begin if Mode then s := _L1.Names[i] else s := _L1.ValueFromIndex[i]; for j := 0 to _L2.Count - 1 do s := StringReplace(s, _L2.Strings[j], '', [rfReplaceAll]); if Mode then _L1.Strings[i] := Format('%s=%s', [s, _L1.ValueFromIndex[i]]) else _L1.Strings[i] := Format('%s=%s', [_L1.Names[i], s]); end; end; procedure TForm1.Button1Click(Sender: TObject); var Files_1: TextFile; S: string; mas: array of string; Found: Boolean; i: integer; Sl: TStringList; begin if OpenDialog1.Execute then begin AssignFile(Files_1, OpenDialog1.FileName); reset(Files_1); end; sl:=TStringList.Create; while not Eof(Files_1) do begin ReadLn(Files_1, S); // Удаляет из текстового файла до знака "=" (Все что указанно в memo3) if sl.Count > 0 then Working(sl, Memo3.Lines, true); // Удаление из текстового файла после знака "=" (Все что указанно в memo4) if sl.Count > 0 then Working(sL, Memo4.Lines, false); sL.Add(s); end; sl.SaveToFile(ExtractFileDir(OpenDialog1.FileName)+'\ Text_File_Save.txt'); CloseFile(Files_1); end; |