Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.08.2014, 14:26   #1
avante
 
Регистрация: 06.12.2010
Сообщений: 9
Вопрос Конкатенация строк двух файлов по результатам их сравнения

Прошу помощи в решении следующей задачи.
Дано два одинаковых текстовых файла по 500 строк под разными именами. Строки такого образца:
1 2 19 20 23 19 20 23 7 6 3 62 16
1 2 19 21 22 19 21 22 7 5 4 62 16
1 3 18 19 24 18 19 24 8 7 2 61 17
1 3 18 20 23 18 20 23 8 6 3 61 17
5 6 8 21 25 5 6 8 21 20 18 19 59
...

А задача вот в чем: сравнить каждую строку 1-го файла поочередно со всеми строками 2-го файла. Условия сравнения: первые пять слов (словом считать последовательность символов между пробелами) строки 1-го файла должны отличаться от первых пяти слов строки другого файла, т.е. это 10 разных слов. Одновременно с этим 6-е, 7-е, 8-е слова той же строки того же 1-го файла допжны совпадать с 9-м, 10 -м, 11-м словами строки другого файла, необязательно по порядку, и 12-е слово все той же строки того же 1-го файла должно совпадать с 13-м словом строки другого файла. Все условия должны сходиться в одной строке, как в одном так и в другом файле. Строки, отвечающие этим условиям конкатенируются и записываются в 3-й файл. Количество строк сократится более чем вдвое, не все строки найдут пары.
Написал я программу на Pascal ABC.Net, но в ней нужна мне основательная помощь. Условие в ней взял сокращенное, не идет пока сама программа.
Пожалуйста, помогите, кто как может.

Код:
uses crt; { в файле считать}
var dan, d917, ex1825: text; {Фильтрация файла по заданным числам в строках}
    str, substr, strd, substrd: string;
    chisl: array[1..253] of Integer;
    chisld: array[1..253] of Integer;
    f, fd, i, id, num, cod, fs, numd, codd, fds: LongInt;    
begin
 ClrScr;
 Assign(dan, '10xesum651825(500)+SumCoch1825+3r(sorted).txt'); ReSet(dan);
 Assign(d917, 'c-10xesum651825(500)+SumCoch1825+3r(sorted) — копия.txt'); ReSet(d917);
 Assign(ex1825,'oumn.txt'); ReWrite(ex1825);
 f := 0;
 while not EoF(dan) do
  begin
   ReadLn(dan, str);
   inc(f);
   substr := '';
   i := 1;
   num := 0;   
   while i < Length(str)  do
    begin
     num := num + 1;
     while (str[i] = ' ') and (i <= Length(str))do begin substr := ''; inc(i); end  ;
     while (str[i] <> ' ') and (i < Length(str))do begin substr := substr + str[i]; inc(i); end  ;
     val(substr, chisl[num], cod);
     fs := f;
     //Close(dan);  ReSet(dan);
 fd := 0;   
 while not EoF(d917) do
  begin
   ReadLn(d917, strd);
   inc(fd);
   substrd := '';
   id := 1;
   numd := 0;   
   while id < Length(strd) do
    begin
     numd := numd + 1;
     while (strd[id] = ' ') and (id <= Length(strd))do begin substrd := ''; inc(id); end  ;
     while (strd[id] <> ' ') and (id < Length(strd))do begin substrd := substrd + strd[id]; inc(id); end  ; 
     val(substrd, chisld[numd], codd);
     fds := fd;
     //Close(d917);  ReSet(d917);
     for f := 1 to fs do
      for fd := 1 to fds do begin
       if chisl[12] = chisld[13] then WriteLn(ex1825, str, '    ', strd); end;
       end; end; end; end;
 Close(dan); Close(d917); Close(ex1825);
end.
avante вне форума Ответить с цитированием
Старый 02.08.2014, 17:13   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Жуть какая-то...
Это разовая задача?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.08.2014, 17:29   #3
avante
 
Регистрация: 06.12.2010
Сообщений: 9
По умолчанию

Очередная в некотором проекте. А что по самому вопросу внутри задачи?
avante вне форума Ответить с цитированием
Старый 02.08.2014, 17:54   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А вот по решению я бы предложил TStringList, но увы я не в курсе как в АБЦшке дела обстоят. Вроде в ней нет такого. Соответственно я бы создал некую функцию, которая бы разваливала строку в массив слов: http://www.programmersforum.ru/showt...369#post398369
А уже потом каждую строку загнав в двумерный массив работал бы именно с элементами массива.

P.S. Я понимаю что у тебя это уж есть, но я бы именно в функцию ее вывел.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 02.08.2014, 18:59   #5
avante
 
Регистрация: 06.12.2010
Сообщений: 9
По умолчанию

Ясности и понимания не прибавилось. Я, конечно, могу ошибаться, но мне кажется, надо правильно расставить скобки, т.е. end'ы и в нужных местах закрывать файлы. Это я перепробовал, другое не осиливаю, как Вашу функцию пристроить не знаю. Пожалуйста, попробуйте исправить мой код.
Прочитал я Ваш адрес и выражаю сопереживание по поводу испытаний, выпавших на долю Вашей родины.
avante вне форума Ответить с цитированием
Старый 12.08.2014, 13:49   #6
avante
 
Регистрация: 06.12.2010
Сообщений: 9
По умолчанию

Помогите хоть кто-нибудь, хоть любое решение задачи объединения строк двух файлов по условию, на любом паскале
avante вне форума Ответить с цитированием
Старый 12.08.2014, 15:53   #7
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

поскольку в файлах у нас числа, то разбор строки доверим самому паскалю (ReadLn умеет сам переводить числа).
Код:
ReadLn(f, a[1], a2[2], .... , a[12]); //прочитать двенадцать(!) чисел записанных в строку с произвольным(! >0) числом пробелов  между ними.
остаток программы
Код:
  AssignFile(dan, 'file1.txt');
  Assignfile(d917, 'file2.txt');
  AssingFile(ex1825, 'file3.txt');
  Reset(dan);
  while not EoF(dan) do begin
    ReadLn(dan, chisl[1], chisl[2], chisl[3], chisl[4], chisl[5], chisl[6], chisl[7], chisl[8], chisl[9], chisl[10], chisl[11], chisl[12] );

    Reset(d917);
    while not EoF(d917) do begin
      ReadLn(d917, chisld[1], chisld[2], chisld[3], chisld[4], chisld[5], chisld[6], chisld[7], chisld[8], chisld[9], chisld[10], chisl[11], chisld[12] );

       if chisl[12] = chisld[13] then
         WriteLn(ex1825, chisl[1], chisl[2], chisl[3], chisl[4], chisl[5], chisl[6], chisl[7], chisl[8], chisl[9], chisl[10], chisl[11], chisl[12],
                         chisld[1], chisld[2], chisld[3], chisld[4], chisld[5], chisld[6], chisld[7], chisld[8], chisld[9], chisld[10], chisl[11], chisld[12] );
    end;
  end;
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 12.08.2014 в 15:55.
evg_m вне форума Ответить с цитированием
Старый 12.08.2014, 15:59   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

вариант для чтения произвольного чисел в строке
Код:
for j:=1 to 12 do begin
  if not eoln(f) then Read(f, s[j]);
end;
ReadLn(f);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.08.2014, 20:54   #9
avante
 
Регистрация: 06.12.2010
Сообщений: 9
По умолчанию

evg_m, большое спасибо. Исключительно благодаря Вам написал я такую программу:
Код:
uses crt; { в файле считать}
var dan, d917, ex1825: text; {Фильтрация файла по заданным числам в строках: получаем отобранный файл}    
    chisl: array[1..13] of Integer;
    chisld: array[1..13] of Integer;    
begin
 ClrScr;
 AssignFile(dan, '10xesum651825(500)+SumCoch1825+3r(sorted).txt');
 Assignfile(d917, 'c-10xesum651825(500)+SumCoch1825+3r(sorted) — копия.txt');
 AssignFile(ex1825, 'file3.txt'); ReWrite(ex1825);
 Reset(dan);
  while not EoF(dan) do begin
   ReadLn(dan, chisl[1], chisl[2], chisl[3], chisl[4], chisl[5], chisl[6], chisl[7], chisl[8], chisl[9], chisl[10], chisl[11], chisl[12], chisl[13]);
 Reset(d917);  
   while not EoF(d917) do begin
    ReadLn(d917, chisld[1], chisld[2], chisld[3], chisld[4], chisld[5], chisld[6], chisld[7], chisld[8], chisld[9], chisld[10], chisld[11], chisld[12], chisld[13]);

     if chisl[12] = chisld[13] then
      WriteLn(ex1825, chisl[1], ' ', chisl[2], ' ', chisl[3], ' ', chisl[4], ' ', chisl[5], '  ', chisl[6], ' ', chisl[7], ' ', chisl[8], '  ', chisl[9], ' ', chisl[10], ' ', chisl[11], '  ', chisl[12], ' ', chisl[13], '   ',
                     chisld[1], ' ', chisld[2], ' ', chisld[3], ' ', chisld[4], ' ', chisld[5], ' ', chisld[6], ' ', chisld[7], ' ', chisld[8], ' ', chisld[9], ' ', chisld[10], ' ', chisld[11], ' ', chisld[12], ' ', chisld[13], ' ');
    end;
  end;
 Close(dan); Close(d917); Close(ex1825);
end.
Правильно ли?
Пожалуйста, объясните мне, почему ReSet'ы стоят перед чтением, а не сразу за Assign'ом? И почему end'ы стоят так, а не по другому? Хотя в таком виде работает наиболее лучше.
Еще раз Вам спасибо
avante вне форума Ответить с цитированием
Старый 13.08.2014, 21:00   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
почему ReSet'ы стоят перед чтением, а не сразу за Assign'ом?
Assign не открывает файл. Эта процедура просто задает переменку характеристики файла. reset() или rewrite() не обязательно ставить сразу после него. Главное поставить до первого чтения\записи.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сравнение строк двух файлов с сортировкой avante Паскаль, Turbo Pascal, PascalABC.NET 9 04.05.2013 15:06
Сравнение строк двух текстовых файлов Alina111 Общие вопросы C/C++ 4 10.01.2013 10:03
сумма по результатам сравнения данных Shelli Microsoft Office Excel 2 28.09.2012 12:24
Excel -скрипт сравнения двух файлов и копирования данных из одного в другой Snake_ Microsoft Office Excel 11 29.08.2010 13:19
конкатенация строк larry Win Api 3 26.07.2009 08:22