Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Delphi |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
Валерий666 Member Откуда: Сообщений: 117 |
Подскажите как решить проблеммку. Имеется файл в 40-50-100 тысяч строк. Строка формата С. Л. З. C. В. ЛС Фамилия Имя Отчество Дата Осн. документ Серия, Личный номер Дата Дата Дата рег. по ПрТипДатаДаДата Адрес ЛС Как можно заменить пробелы между словами на один знак табуляции. Чтобы в результате получить нормально отформатированный текст, который бы разбивался на колонки в Excele(к примеру). |
28 сен 17, 13:00 [20828857] Ответить | Цитировать Сообщить модератору |
Dimitry Sibiryakov Member Откуда: Сообщений: 44662 |
Простенький цикл, заменяющий два пробела подряд табуляцией и убирающий все последующие пробелы. В чём проблема-то? Posted via ActualForum NNTP Server 1.5 |
28 сен 17, 13:05 [20828870] Ответить | Цитировать Сообщить модератору |
DimaBr Member Откуда: Сообщений: 10414 |
procedure TForm1.Button2Click(Sender: TObject); var SL: TStringList; i,j: integer; S: string; begin SL := TStringList.Create; // SL.LoadFromFile(); SL.Add(' С. Л. З. C. В. ЛС Фамилия Имя Отчество Дата Осн. документ Серия, Личный номер Дата Дата Дата рег. по ПрТипДатаДаДата Адрес ЛС'); for i := 0 to SL.Count-1 do begin S := SL[i]; repeat j := Pos(' ',S); if j > 0 then S := StringReplace(S,' ',' ',[rfReplaceAll]); until j = 0; SL[j] := StringReplace(S,' ',#9,[rfReplaceAll]); end; end; |
28 сен 17, 13:22 [20828920] Ответить | Цитировать Сообщить модератору |
Валерий666 Member Откуда: Сообщений: 117 |
DimaBr, Со строкой работает, с файлом не хочет( Что не так? procedure TForm1.sButton1Click(Sender: TObject); var SL: TStringList; i,j: integer; S: string; path:string; begin getdir(0,path); SL := TStringList.Create; SL.LoadFromFile(path+'\1.txt'); // SL.Add(sedit1.text); for i := 0 to SL.Count-1 do begin S := SL[i]; repeat j := Pos(' ',S); if j > 0 then S := StringReplace(S,' ',' ',[rfReplaceAll]); until j = 0; SL[j] := StringReplace(S,' ',#9,[rfReplaceAll]); end; sl.SaveToFile(path+'\result.txt'); //sEdit2.Text:=sl.Text; sl.Free; end; |
28 сен 17, 14:16 [20829040] Ответить | Цитировать Сообщить модератору |
Валерий666 Member Откуда: Сообщений: 117 |
Понял почему не работает. |
28 сен 17, 14:24 [20829059] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
Вот вариант оптимизированныйprogram Project1; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; function Skip(const str: string): string; var p: PChar; l, r: Integer; b: Boolean; begin l := Length(str); SetLength(Result, l); r := 1; p := Pointer(str); while p^ <> #0 do begin if (p^ = ' ') and ((p + 1)^ = ' ') then b := true; Result[r] := p^; inc(p); inc(r); if b then begin b := False; while p^ = ' ' do inc(p); end; end; SetLength(Result, r - 1); end; var str: string; begin try str := 'g 54 6767 67 rh'; str := Skip(str); Writeln(str); Readln; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end. |
28 сен 17, 15:10 [20829218] Ответить | Цитировать Сообщить модератору |
schi Member Откуда: Москва Сообщений: 2440 |
Няшик, Можно поинтересоваться, в каком языке слово skip имеет отношение к форматированию ? |
28 сен 17, 17:22 [20829771] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
Имелось введу скипнуить лишние пробелы. Имя функции больше не на что не рассчитано. Оно очень глупое и не целесообразное. Конечно в производство такое нельзя пихать, иначе это станет головной болью. Но это всего лишь демонстрация |
||
28 сен 17, 19:28 [20830056] Ответить | Цитировать Сообщить модератору |
schi Member Откуда: Москва Сообщений: 2440 |
Такой код вообще никуда нельзя, даже для демонстрации. Sad but true. |
||||
28 сен 17, 22:37 [20830350] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
Няшик, ты Лошарик, а не Няшик. Надеюсь, тебе стыдно. |
28 сен 17, 22:51 [20830397] Ответить | Цитировать Сообщить модератору |
Gator Member Откуда: Москва Сообщений: 13809 |
![]() |
||
28 сен 17, 23:05 [20830424] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
Нет, мне не должно быть стыдно... Это вам, раз вы не можете без длинной функции Pos
Без длмнной функции StringReplace
Хотя скорее это завсить. Что я легко могу обходиться без всего этого хлама,и писать довольно гибкий код. Функция SetLength не копирует строку в моём случае, а делает реллок - уменьщая длину. |
||
28 сен 17, 23:38 [20830502] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
Эти функции плохи тем, что они гоняют одни и те же строки по много раз. И тормозят код во много. Мой же код, использует два цикла. Один, что бы прогнать основную строку, и второй - убрать лишние пробелы. Просто - та кода. А у вас - дикий лес из тормозов. Полезные ресурсы тратите попросту. |
28 сен 17, 23:41 [20830506] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
К тому - же, времени я угрохал не больше 30 секунд на написания своего кода... А вот в случае кода DimaBr, думаю столько - же. Только на + 10 и даже + 20 секунд дольше. Так как его код сложен в понимании. А мой лёгкий как при написании, так в чтении. |
28 сен 17, 23:44 [20830513] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
Блин, сижу и в голову взбрело. Сейчас же по налетите как мухи, и будите твердить - быстрота кода не важна, для бизнес приложения. - Грех не использовать что заложили в функционал среды - разработчики умнее Это всё чистые предрассудки. Быстрота кода нужна - для быстрой сортировки, к примеру. К тому - же, далеко не известно какое железо будет у пользователя. И на сколько под хламом прогибаться. Так что ваш код из pos и StringReplace может и пару минут работать на файлах в 100 тысяч строк. |
28 сен 17, 23:48 [20830518] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
Покажи в коде "плохой" функции Pos(). В каком именно месте там "гоняются строки по много раз". |
||
29 сен 17, 00:00 [20830542] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
Давай подсчитаем. Первый цикл for i := 0 to SL.Count-1 do begin В функции Pos идут уже два цикла repeat until
Теперь, отбрасываем все проверки (Туча проверок! ДОХРЕНИЩЕ) И смело считаем сколько раз нам надо потратить только тактов на функцию POS в обходе цикла for для длины SL.Count (В частности, вы должны учесть - то, что мы не идём от строки к строке. Мы ещё режим саму строку - удаляя из неё лишние пробелмы, прежде чем перейти к следующей.)
Осознаёшь сколько работает лишнего кода под капотом ? Не уважаю я такой код. |
||||
29 сен 17, 00:44 [20830577] Ответить | Цитировать Сообщить модератору |
white_nigger Member Откуда: Тула Сообщений: 1760 |
|
||
29 сен 17, 00:58 [20830587] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
Кто сказал что не решает?
|
|||||
29 сен 17, 01:13 [20830597] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
Вот прямая ссылка на картинку http://www.fotolink.su/pic_b/4304d4bd6ad9fd1e130e29e8973c742e.png |
29 сен 17, 01:15 [20830599] Ответить | Цитировать Сообщить модератору |
crossa Member Откуда: Сообщений: 52 |
Няшик, Ваш код быстрее и эффективнее, не о чем тут спорить. Надо присвоить значение переменной b в начале функции Skip: b := False; |
29 сен 17, 01:15 [20830600] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
crossa, Да, действительно. Для лазура бы это было актуально. Но для Delphi они по умолчанию в false встаёт, по этому у меня не было в мыслях написать это условие. Хотя если я не прав, и при каких - то условиях вместо false компилятор Delphi может выделить true, то поправьте. |
29 сен 17, 01:18 [20830601] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
В каком конкретно месте "гоняются строки по много раз". Покажи. Хотя бы одну-единственную строчку. |
|||||
29 сен 17, 01:31 [20830608] Ответить | Цитировать Сообщить модератору |
чччД
Guest |
Локальные переменные будут тебе инициализироваться, ага. Точно Лошарик. |
||
29 сен 17, 01:33 [20830609] Ответить | Цитировать Сообщить модератору |
Няшик Member Откуда: Екатеринбург Сообщений: 885 |
Да ты просто издеваешься - понимая что код тот очень тормознутый. И меня просто зассрать хочешь - ох делать тебе нефиг. Я ведь показал как обойтись без гадости этакой.
Вечно меня тут оскорбляешь. Хотя сам и пальцем не пошевелил. Жена в постельке не даёт? Ох бедненький, ну хорошо что я могу помочь тебе хоть как то неновисть выместить. Крепись там. Да, я провёл аналогию. Первая переменная bool всегда в false. На неё прямой адрес стоит, дебагер показал 004D89A0 40 inc eax Все остальные идут уже через смещения ebp |
|||||||||
29 сен 17, 01:44 [20830616] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 3 вперед Ctrl→ все |
Все форумы / Delphi | ![]() |