Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.119.241] |
|
Сообщ.
#1
,
|
|
|
Предоставлен, полностью, рабочий код:
У меня возник вопрос: Как правильно переделать код (ПОД ЧТЕНИЕ ПОСТРОЧНО) что бы место TFile.ReadAllLines('all.txt'); - был OpenDialog1.FileName. И сохранения шло через writeln(); Рабочий код: uses System.IOUtils, System.Types; procedure TForm1.Button1Click(Sender: TObject); var A: TStringDynArray; Index: array of integer; Unic, Rez: TStringList; i, j, k: integer; s: String; begin A := TFile.ReadAllLines('all.txt'); SetLength(Index, Length(A)); Unic := TStringList.Create; for i := Low(A) to High(A) do begin s := Copy(A[i], Pos('№', A[i]) + 1, Pos('>', A[i]) - Pos('№', A[i]) - 1); k := Unic.IndexOf(s); if k = -1 then Index[i] := Unic.Add(s) else Index[i] := k; end; for i := 0 to Unic.Count - 1 do begin Rez := TStringList.Create; for j := Low(Index) to High(Index) do if Index[j] = i then Rez.Add(A[j]); Rez.SaveToFile(Format('%s%s.txt', [ExtractFilePath(ParamStr(0)), Unic.Strings[i]])); Rez.Free; end; Unic.Free; end; |
Сообщ.
#2
,
|
|
|
Друзья, выручайте кто более опытный... В долгу не останусь...
|
Сообщ.
#3
,
|
|
|
Первое как-то так:
if OpenDialog1.Execute(Handle) = idOK then begin A := TFile.ReadAllLines(OpenDialog1.FileName);// 'all.txt'); ... Добавлено Это было просто открытие такого-то файла. Запись как-то из: var ... bsF : System.Text; outFile:string; begin ... outFile := Format(...); // получаем имя if FileExists(outFile) then // есть - допишем System.Append(bsF) else // новый - сначала System.Rewrite(bsF); for ... begin str := rez.Strings[j]; writeln( bsF, str); end; |
Сообщ.
#4
,
|
|
|
Славян, Благодарен за подсказку, но при таком варианте не проходит, точнее не работает код. Буду думать, спасибо.
|
Сообщ.
#5
,
|
|
|
Да, то была схема, полезные мысли. Детали бесспорно надо доделывать и додумывать.
|
Сообщ.
#6
,
|
|
|
Kirilis2018
Ты опиши словами что делает код, так будет проще его переписать |
Сообщ.
#7
,
|
|
|
^D^ima, Вот полное описание кода:
Сохранение строк, в один файл, с одинаковым текстом, между знаками. Есть текстовый файл, в котором (пример) строк: Text6№111>Text1 Text5№111>Text2 Text4№222>Text3 Text3№222>Text4 Text2№333>Text5 Text1№333>Text6 Что делает код: Сохраняет, все строки, по разным, текстовым файлам, где между символами № и > встречаются одинаковый (идентичный) текст. В данном случае: В текстовый файл с именем 111.txt сохранится результат (поскольку текст 111 между знаками № и > одинаковый): Text6№111>Text1 Text5№111>Text2 В текстовый файл с именем 222.txt сохранится результат (поскольку текст 222 между знаками № и > одинаковый): Text4№222>Text3 Text3№222>Text4 В текстовый файл с именем 333.txt сохранится результат (поскольку текст 333 между знаками № и > одинаковый): Text2№333>Text5 Text1№333>Text6 Код то работает, но нужно через построчное чтение (AssignFile, writeln()), поскольку, если файл большой то (код что выше) просто загружает оперативную память (и после происходит ошибка нехватки памяти). |
Сообщ.
#8
,
|
|
|
Что сложного?
Var FIn,FOut:TextFile; SIn,FOutName:String; begin AssignFile(FIn,'C:\In.txt'); Reset(FIn); While not EOF(FIn) do Begin Readln(FIn,SIn); FOutName:='C:\'+Copy(SIn, Pos('№', SIn) + 1, Pos('>', SIn) - Pos('№', SIn) - 1)+'.txt'; AssignFile(FOut,FOutName); IF FileExists(FOutName) then Append(FOut) else Rewrite(FOut); Writeln(FOut,SIn); CloseFile(FOut); End; CloseFile(FIn); end; |
Сообщ.
#9
,
|
|
|
^D^ima, Именно то что нужно было! Дмитрий спасибо ОГРОМНЕЙШЕЕ!
|
Сообщ.
#10
,
|
|
|
Kirilis2018
Пожалуйста. Как скорость работы кода, намного медленнее чем в 1 посте? |
Сообщ.
#11
,
|
|
|
^D^ima, Скорость медленней но за то размеры побольше принимает. Еще раз спасибо!
|