Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 20.11.2024
Сообщений: 13

Создание огромного txt файла на Delphi 7

20.11.2024, 18:13. Показов 2289. Ответов 35
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте уважаемые форумчане, обращаюсь к вам с советом. Я пишу на Delphi 7 и решаю одну интересную задачку, но что то не выходит у меня, может подскажите реализацию. Дело в том что мне нужно сгенерировать текстовый файл с большим объёмом данных, то есть программа должна уметь работать с большими объёмами данных в гигабайтах (50-100гбайтный файл генерировать например).
К сожалению проблема заключается именно в скорости генерации такого файла. Я в такого рода оптимизация не спец и единственное поверхностное моё решение (которое работает но медленно для таких объёмов выглядит так):

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
unit FileGenerator;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;
 
type
  TForm1 = class(TForm)
    btnGenerate: TButton;
    ProgressBar: TProgressBar;
    lblStatus: TLabel;
    edtFileSize: TEdit;
    lbl1: TLabel;
    Label1: TLabel;
    procedure btnGenerateClick(Sender: TObject);
  private
    procedure GenerateFile(const FileSize: Int64);
    function GenerateRandomString: string;
  public
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.btnGenerateClick(Sender: TObject);
var
  FileSize: Int64;
begin
  FileSize := StrToInt64(edtFileSize.Text) * 1024 * 1024;
  lblStatus.Caption := 'Генерация файла...';
  GenerateFile(FileSize);
end;
 
procedure TForm1.GenerateFile(const FileSize: Int64);
var FileStream: TFileStream;
    Buffer, Line: string;
    TotalBytesWritten: Int64;
begin
  Randomize;   
  FileStream := TFileStream.Create('output.txt', fmCreate);
  try
    TotalBytesWritten := 0;
    ProgressBar.Max := FileSize;
    while TotalBytesWritten < FileSize do
    begin
      Line := IntToStr(Random(1000000)) + '^' + GenerateRandomString + sLineBreak; 
      Buffer := Line;
      FileStream.WriteBuffer(Pointer(Buffer)^, Length(Buffer));
      TotalBytesWritten := TotalBytesWritten + Length(Buffer);
      ProgressBar.Position := TotalBytesWritten;
      Application.ProcessMessages; 
    end;
  finally
    FileStream.Free;
    lblStatus.Caption := 'Файл сгенерирован!'; 
  end;
end;
 
function TForm1.GenerateRandomString: string;
const Chars: array[0..25] of Char = ('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З',
                                     'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
                                     'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш');
var i: Integer;
begin
  Result := '';
  for i := 1 to Random(10) + 5 do // длина строки от 5 до 15 символов
    Result := Result + Chars[Random(Length(Chars))];
end;
 
end.
От вас уважаемые форумчане, я хотел бы увидеть пример как можно быстро сгенерировать очень объёмный файл,
если есть примеры реализации был бы безмерно благодарен. Даже если это что то сложно для понимания и
написано каком либо сложно читаемом низком уровне допустим, любому решению или идее был бы рад, заранее благодарю.

P.S. Я вот думаю, если с delphi не получится проделать подобный фокус, быть может стоит попробовать перенести реализацию на допустим bat файл или ещё как то. Может как то можно в потоки подсунуть подобную генерацию, пожалуйста подскажите в каком направлении хотябы пойти?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.11.2024, 18:13
Ответы с готовыми решениями:

Создание файла (txt) теста через Delphi
Не создаёт файл с вопросами и ответами, даже если есть уже созданный файл, то всё равно не пишет в него, а показывает, что указан другой...

Быстрый парсинг огромного txt файла (800 мб)
В общем нужно распарсить в массив Integer-ов огромный текстовый файл (800 мб), состоящий из 1 длинной строки, которая состоит из чисел от 1...

Создание txt файла с данными из другого txt файла
Всем привет. Создаю файл: if (!FileExists(&quot;logfile.txt&quot;)) { TStringList * LogFile = new TStringList; ...

35
Злостный нарушитель
 Аватар для Verevkin
10893 / 5829 / 1288
Регистрация: 12.03.2015
Сообщений: 26,896
21.11.2024, 10:36
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от MrHayno Посмотреть сообщение
Можно ли тут генерировать и писать строку или массив символов не теряя в скорости?
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
21.11.2024, 10:50
Цитата Сообщение от MrHayno Посмотреть сообщение
Можно ли придумать оптимальное решение?
Можно эти строки копировать в относительно большой буфер (около 128 килобайт вполне подойдёт), и когда буфер заполнится, то отправить его на запись в файл.

Добавлено через 9 минут
Цитата Сообщение от Verevkin Посмотреть сообщение
Главный тормоз
Зависит от размера буфера.
0
Злостный нарушитель
 Аватар для Verevkin
10893 / 5829 / 1288
Регистрация: 12.03.2015
Сообщений: 26,896
21.11.2024, 10:52
Цитата Сообщение от AzAtom Посмотреть сообщение
Зависит от размера буфера.
Согласен.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
21.11.2024, 10:53
Ну и конечно, при наличии ProcessMessages в таком месте нужно предусмотреть защиту от повторного выполнения этой процедуры, либо, постоянно иметь в виду, что нельзя нажимать кнопку "Старт" до окончания работы либо до остановки вручную.
0
0 / 0 / 0
Регистрация: 20.11.2024
Сообщений: 13
21.11.2024, 10:57  [ТС]
Цитата Сообщение от AzAtom Посмотреть сообщение
Можно эти строки копировать в относительно большой буфер (около 128 килобайт вполне подойдёт), и когда буфер заполнится, то отправить его на запись в файл.
Эм, кажется нечто подобное я и пытался сделать в первом примере в шапке, вы не могли бы продемонстрировать как это по вашему должно выглядеть? Хочу разобраться
0
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
21.11.2024, 12:35
ну прям как у дяди Высоцкого

Ой, Вань, гляди-кась, попугайчики,
Нет, я ей-богу закричу,
А это кто в короткой маечке,
Я, Вань, такую же хочу.
В конце квартала правда, Вань,
Ты мне такую же сваргань,
Ну что "отстань", опять "отстань",
Обидно, Вань.

Уж ты бы лучше помолчала бы,
Накрылась премия в квартал,
Кто мне писал на службу жалобы,
Не ты, да я же их читал.
К тому же эту майку, Зин,
Тебе напяль - позор один,
Тебе шитья пойдёт аршин,
Где деньги, Зин.

Ещё раз, программа сама ничего не пишет - она даёт команду системе записать из памяти по принципу - оттуда и столько-то. Оно попадает в стек, а дальше когда у системы дойдут руки. Всё! Больше ничего! Единственное, что Вы можете сделать это свести время физической записи на винт и время открывает > ищет место в MFT > пишет > изменяет MFT > зарывает к уравнению А = В. Причём многое зависит от винта кеш-контроллера, RMPS, количества головок\блинов, UDMA и самое главное, с чем система решила обратиться к диску - в общем, стек записи\чтения.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
21.11.2024, 19:07
Цитата Сообщение от stalkernet Посмотреть сообщение
насколько помню в Д7 длинна и позиция в стриме заявлена как integer....
Int64.

Добавлено через 5 минут
Цитата Сообщение от stalkernet Посмотреть сообщение
ну прям как у дяди Высоцкого
И далее - это всё к вопросу ТС какое отношение имеет? Давайте без грандиозного оффтопа.
0
0 / 0 / 0
Регистрация: 20.11.2024
Сообщений: 13
21.11.2024, 19:51  [ТС]
Это всё конечно очень здорово, но по факту, я сейчас топчусь на месте и не знаю что и как в итоге сделать. У меня нет чёткого понимания что как правильнее быстро записать, чтобы добиться нужного результата. Я так понял тема начинает превращаться в оффтоп, стоит наверное заканчивать - всех благодарю за оказанную помощь!=)
Так или иначе это дало какое то видение и опыт. Большего наверное ожидать не следовало)
0
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
21.11.2024, 21:44
MrHayno, да куда уж проще?

берёшь StopWatch для измерения времени.
берёшь buffer.
в цикле пишешь через FileWrite например 1000 раз.
смотришь, сколько заняло времени.
увеличиваешь buffer на, например, 10 байт.
повторяешь запись.
смотришь, сколько заняло времени.

и так повторять, пока время не перестанет уменьшатся.
как только перестало - ВСЁ, ТЫ ДОСТИГ МАХ ПРОПУСКНОЙ СПОСОБНОСТИ СИСТЕМЫ.
хочется еще быстрее - ОТРУБАЕШЬ ВСЕ НЕНУЖНЫЕ СЕРВИСЫ, СЛУЖБЫ, ГАДЖЕТЫ И ПРОЧУЮ ЕРУНДУ, удивишься, как это влияет.

РЕКОМЕНДУЮ НАЧАТЬ С РАЗМЕРА BUFFER РАВНОГО 1 БАЙТУ.

Добавлено через 52 минуты
MrHayno, код для теста
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
procedure TForm1.Button4Click(Sender: TObject);
var
 n, i: uint32;
 f: integer;
 len: uint32;
 buff: TBytes;
 SW: TStopWatch;
begin
len := 1;
SW := TStopWatch.Create;
 for I := 1 to 100 do begin
  setlength(buff, len);
  f := FileCreate('TESTWRite.DAT');
  SW.Reset;
  SW.Start;
  for n := 1 to 100000 do begin
   FileWrite(f, Buff, 0, Length(buff));
  end;
  SW.Stop;
var Mbs := RoundTo(((Length(buff) * 100000) / 1024) / 1024, -3);
  Memo1.Lines.Add(DecodeStWtTime(SW) +' Write '+ Mbs.ToString +' Mbytes');
  FileClose(f);
  len := Len + 10; // поиграйся с размером
  sleep(20); // а вот сдесь изменения тебя удивят как это влияет на стабильность времени
 end;
end;
DecodeStWtTime - моя функция декодирования времени. замени на свою.

AzAtom, Int64 - окстись, D7 из того времени, когда файл-данные на 100Мбайт вызывали фразу - у тебя там что, порнуха закодирована???? да и системы х32.
0
0 / 0 / 0
Регистрация: 20.11.2024
Сообщений: 13
21.11.2024, 22:07  [ТС]
Цитата Сообщение от stalkernet Посмотреть сообщение
MrHayno, да куда уж проще?
берёшь StopWatch для измерения времени.
берёшь buffer.
в цикле пишешь через FileWrite например 1000 раз.
смотришь, сколько заняло времени.
увеличиваешь buffer на, например, 10 байт.
повторяешь запись.
смотришь, сколько заняло времени.
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    function GenerateRandomString: string;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function TForm1.GenerateRandomString: string;
const Chars: array[0..25] of Char = ('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З',
                                     'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
                                     'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш');
var i: Integer;
begin
  Result := '';
  for i := 1 to Random(10) + 5 do // длина строки от 5 до 15 символов
    Result := Result + Chars[Random(Length(Chars))];
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var StartTime, EndTime: Cardinal;
    Buffer: AnsiString;
    FileHandle: Integer;
    I: Integer;
    TotalBytesWriten: Int64;
    FileSize: Int64;
begin
  FileSize := StrToInt64(Edit1.Text) * 1024 * 1024;
  Randomize;
 
  FileHandle := FileOpen('testfile.txt', fmOpenWrite or fmShareDenyNone);
  if FileHandle = -1 then
    FileHandle := FileCreate('testfile.txt');
 
  TotalBytesWriten:=0;
 
  StartTime := GetTickCount;
 
  while TotalBytesWriten<FileSize do
  begin
    Buffer := IntToStr(Random(1000000))+'^'+GenerateRandomString+#13#10;
    FileWrite(FileHandle, PAnsiChar(Buffer)^, Length(Buffer));
    TotalBytesWriten:=TotalBytesWriten+Length(Buffer);
  end;
 
  EndTime := GetTickCount;
 
  FileClose(FileHandle);
 
  Memo1.Lines.Add('Время записи строк: ' + IntToStr(EndTime - StartTime) + ' миллисекунд');
end;
 
end.
Вот фигня моя опираясь на подсказки, только вместо байт строка. получается по записи что то около 5минут на 1 гиг.
Я боюсь отвалится запись на большом объёме данных, типа 50 гиг. Да и долго будет
3_new_2.rar

P.S. кажется StopWatch н на 10ом делфи есть, на 7ом вроде нет, поэтому взял GetTickCount
0
0 / 0 / 0
Регистрация: 20.11.2024
Сообщений: 13
21.11.2024, 22:29  [ТС]
Взял также ограничение длины
Delphi
1
setlength(Buffer, 1);
после
Delphi
1
TotalBytesWriten:=0;
Добавлено через 8 минут
Кажется что то нащупал, подтвердите догадки. Использовал вложенный for внутрь while - запихивая больеш строк в буффер, чем ускорил запись в разы:
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
procedure TForm1.Button1Click(Sender: TObject);
var StartTime, EndTime: Cardinal;
    Buffer: AnsiString;
    FileHandle: Integer;
    I: Integer;
    TotalBytesWriten: Int64;
    FileSize: Int64;
begin
  FileSize := StrToInt64(Edit1.Text) * 1024 * 1024;
  Randomize;
 
  FileHandle := FileOpen('testfile.txt', fmOpenWrite or fmShareDenyNone);
  if FileHandle = -1 then
    FileHandle := FileCreate('testfile.txt');
 
  TotalBytesWriten:=0;
 
  setlength(Buffer, 1);
 
  StartTime := GetTickCount;
 
  while (TotalBytesWriten<FileSize) do
  begin
    for i:=1 to 10 do
    begin
      Buffer :=Buffer+ IntToStr(Random(1000000))+'^'+GenerateRandomString+#13#10;
    end;
    FileWrite(FileHandle, PAnsiChar(Buffer)^, Length(Buffer));
    TotalBytesWriten:=TotalBytesWriten+Length(Buffer);
    Application.ProcessMessages;
  end;
 
  EndTime := GetTickCount;
 
  FileClose(FileHandle);
 
  Memo1.Lines.Add('Время записи строк: ' + IntToStr(EndTime - StartTime) + ' миллисекунд');
end;
На запись 1 гига сгенерированных строк теперь уходит 5-6 секунд
0
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
21.11.2024, 22:44
MrHayno, ну, я не знаю, как ещё проще. на пальцах -

1 Мб = 450 мс
100 Мб = 640 мс

намёк уловил???
вот тут вместо
Delphi
1
2
  Buffer := IntToStr(Random(1000000))+'^'+GenerateRandomString+#13#10;
    FileWrite(FileHandle, PAnsiChar(Buffer)^, Length(Buffer));
надо сделать очень БАААЛЬШОЙ БУФЕР состоящий из меленьеих Buffer и уже его пихать на запись 1 РАЗ. вместо неизвестно сколько раз писать маленький. 1 раз * 640 мс вместо неизвестно сколько * 450 мс.

Всё, ещё проще я не могу...........

Пока писал, опередили. Всё верно.
0
0 / 0 / 0
Регистрация: 20.11.2024
Сообщений: 13
22.11.2024, 00:11  [ТС]
Цитата Сообщение от stalkernet Посмотреть сообщение
Пока писал, опередили. Всё верно.
На самом деле у меня после тестов довольно спорная картина выходит.
Я пытался пересчитать свою строку в байты(сделал так чтобы количество символов в строке было константно)
и задавать setlength равный этому количество байт (31* количество циклов наслаивания буффера), в принципе верный подход, но у меня вылезает мусором в выходящем файле какая то часть памяти незаполненная(хотя количество байт должно биться), пытался подогнать и так и так не вышло.

Попробовал вобратку, setlength занулил и снизил количество наслаиваний буффера до двух(экспериментальным путём почему то выяснил что занижение количества повторов увеличивает производительность, хотя должно быть наоборот),
я пришёл к быстрой работоспособной версии. причём если бы я наслоил три буффера, скорость бы упала.
Это на самом деле обескураживает, но работает теперь как надо. Я спокойно генерирую файл на 50гигов, это примерно по 300мб в секунду пишется на NTFS диск.сист.

Вот конечный экземпляр решения, может кому то пригодится:
Кликните здесь для просмотра всего текста

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    Edit1: TEdit;
    function GenerateRandomString: string;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
function TForm1.GenerateRandomString: string;
const Chars: array[0..25] of Char = ('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З',
                                     'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р',
                                     'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш');
var i,z: Integer;
begin
  Result := '';
  for i := 1 to 10 do // длина строки от 5 до 15 символов
    Result := Result +Chars[Random(Length(Chars))];
    Result := IntToStr(Random(9))+
              IntToStr(Random(9))+
              IntToStr(Random(9))+
              IntToStr(Random(9))+
              IntToStr(Random(9))+
              IntToStr(Random(9))+
              IntToStr(Random(9))+
              IntToStr(Random(9))+
              IntToStr(Random(9))+
              IntToStr(Random(9))+'^'+ Result +#13#10;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var StartTime, EndTime: Cardinal;
    Buffer: AnsiString;
    FileHandle: Integer;
    I: Integer;
    TotalBytesWriten: Int64;
    FileSize: Int64;
begin
  FileSize := StrToInt64(Edit1.Text) * 1024 * 1024;
  Randomize;
 
  FileHandle := FileOpen('testfile.txt', fmOpenWrite or fmShareDenyNone);
  if (FileHandle=-1) then
    FileHandle := FileCreate('testfile.txt');
 
  TotalBytesWriten:=0;
 
  setlength(Buffer, 0);
 
  StartTime := GetTickCount;
 
  while (TotalBytesWriten<FileSize) do
  begin
    for i:=1 to 2 do Buffer:=Buffer+GenerateRandomString;
    FileWrite(FileHandle, PAnsiChar(Buffer)^, Length(Buffer));
    TotalBytesWriten:=TotalBytesWriten+Length(Buffer);
    Application.ProcessMessages;
  end;
 
  EndTime := GetTickCount;
 
  FileClose(FileHandle);
 
  Memo1.Lines.Add('Время записи строк: ' + IntToStr(EndTime - StartTime) + ' миллисекунд');
end;
 
end.

Цитата Сообщение от stalkernet Посмотреть сообщение
надо сделать очень БАААЛЬШОЙ БУФЕР состоящий из меленьеих Buffer и уже его пихать на запись 1 РАЗ
stalkernet то есть объясняю, у меня как получается: Выходит один маленький буфер - медленно, два маленьких в одном - быстро, три маленьких в одном - медленно. Почему то выходит так
И сразу спасибо за подсказки, очень помогло!
0
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
22.11.2024, 08:20
MrHayno,
для начала на вопрос
Цитата Сообщение от MrHayno Посмотреть сообщение
Почему то выходит так
ОЧЕНЬ ВНИМАТЕЛЬНО посмотрите на алгоритм
Delphi
1
2
3
4
5
6
7
 while (TotalBytesWriten<FileSize) do
  begin
    for i:=1 to 2 do Buffer:=Buffer+GenerateRandomString;
    FileWrite(FileHandle, PAnsiChar(Buffer)^, Length(Buffer));
    TotalBytesWriten:=TotalBytesWriten+Length(Buffer);
    Application.ProcessMessages;
  end;
чтоже вы НА САМОМ ДЕЛЕ пишите. подсказка шаг1 буфер 1+2 шаг2 буфур 1+2+3+4 шаг3 буфер 1+2+3+4+5+6
второй намек надо буфер очищать. где? разберетесь.
в третих вместо
Delphi
1
Buffer:=Buffer+
используйте преварительно выделенный большой буфер и команду ccpy\move;
И САМОЕ ГЛАВНОЕ ОТКЛЮЧИТЕ Application.ProcessMessages; ОН У ВАС ЖРЕТ 50% ВРЕМЕНИ
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,496
22.11.2024, 08:51
Цитата Сообщение от stalkernet Посмотреть сообщение
AzAtom, Int64 - окстись, D7 из того времени, когда...
Полезнее не строить догадки, а просто взять и посмотреть исходники.

0
62 / 42 / 3
Регистрация: 04.01.2019
Сообщений: 278
22.11.2024, 08:59
и переделайте
Delphi
1
IntToStr(Random(9))+
например
Delphi
1
Chr(48 + Random(9))
немного но быстрее

и Random(9) это 0-8 а не 0-9

Добавлено через 2 минуты
AzAtom, однако неправ. даже интересно стало.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.11.2024, 08:59

Обработка огромного количества txt-файлов с загрузкой в Excel
Добрый день. Помогите решить задачу с помошью bat файла Есть массив из огромного количества txt файлов около 1000 В каждом файле есть 4...

Создание XML файла из случайно перемешанных строк txt файла
Всем привет! Помогите составить программу : В файле (.txt) через пробел записаны &quot;Страна&quot; &quot;Город&quot; ФИО...

Создание txt файла с текстом, полученным из названия файла в папке
Здравствуйте! В папке содержится огромное число файлов (более 300 тыс в каждой папке), которые имеют следующие названия: ...

Создание txt файла при добавлении файла в архив rar, немного дополнить скрипт
Скрипт архивирует файлы с расширением *.psd и *.jpg @echo off chcp 1251 for /f &quot;tokens=2 delims==:&quot; %%i in (' wmic...

Файл: Переписать текст в t3.txt сначала из файла t1.txt, а потом из файла t2.txt
1) Переписать текст в t3.txt сначала с файла t1.txt, а потом с файла t2.txt 2) Файл t2.txt перенесите в папку K2 3) Файл t1.txt...


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

Или воспользуйтесь поиском по форуму:
36
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru