За последние 24 часа нас посетили 7738 программистов и 648 роботов. Сейчас ищут 194 программиста ...

сравнение 2 xml файлов - удаление дублирующихся строк

Тема в разделе "Сделайте за меня", создана пользователем konstantin.sirin, 4 апр 2019.

  1. konstantin.sirin

    konstantin.sirin Новичок

    С нами с:
    4 апр 2019
    Сообщения:
    6
    Симпатии:
    0
    Всем привет!!!

    Имеется два xml файла

    в первом имеется строки вида <ZAP><N_ZAP>1213</N_ZAP><PR_NOV>0</PR_NOV><PACIENT><ID_PAC>23E51179D4426A7A45258272004C964D</ID_PAC> и еще другого текста

    во втором строка вида <N_ZAP>1213</N_ZAP> без дополнительного текста

    как сравнить два файла и при нахождении строки 2 файла в части строки 1 файла, удалить из обоих файлов эти строки
     
  2. konstantin.sirin

    konstantin.sirin Новичок

    С нами с:
    4 апр 2019
    Сообщения:
    6
    Симпатии:
    0
    Логика приблизительно такая:
    файлы можно привести к виду txt, удалив заголовки (это можно сделать ручками),
    затем из каждого файла сделать массив
    перебрав массив первого файла и массив второго, сравнить строки с условием содержания текста( из второго массива) в первом массиве
    в случае соответствия условию как то удалить строки до их переноса на новую (/r/n)
    Это реализуем на PHP?
     
  3. Babka_Gadalka

    Babka_Gadalka Новичок

    С нами с:
    16 фев 2019
    Сообщения:
    148
    Симпатии:
    18
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    есть функция file которая читает каждую строку и заносит в общий массив.
    Дальше можно в интернете найти "дублирующие значения в массиве"
     
  4. konstantin.sirin

    konstantin.sirin Новичок

    С нами с:
    4 апр 2019
    Сообщения:
    6
    Симпатии:
    0
    эту часть я уже написал, перебираю(foreach) массив 1, внутри перебираю массив 2, сравниваю их значения, вот только не могу понять как найти значения, которые содержат строку <N_ZAP>1213</N_ZAP> игнорируя остальную часть текста до переноса строки, после этого применяю unset

    Вопрос: как найти значения, которые содержат строку <N_ZAP>1213</N_ZAP> игнорируя остальную часть текста до переноса строки
     
  5. Babka_Gadalka

    Babka_Gadalka Новичок

    С нами с:
    16 фев 2019
    Сообщения:
    148
    Симпатии:
    18
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    покажи сначала свой код
     
  6. konstantin.sirin

    konstantin.sirin Новичок

    С нами с:
    4 апр 2019
    Сообщения:
    6
    Симпатии:
    0

    Вообщем как-то так, правда не уверен что это рабочий вариант
    --- Добавлено ---
    Код (Text):
    1.     $one_file_name = "DFM830011S83005_19031.xml"; // Название первого файла
    2.     $two_file_name = "VFM830011S83005_19031.xml"; // Название второго файла
    3.    
    4.     $one = file($one_file_name); // Открываем первый файл и заносим из него все строки в массив
    5.     $two = file($two_file_name); // Открываем второй файл и заносим из него все строки в массив
    6.  
    7.     // Открываем первый файл для записи
    8.     $file_write = fopen($one_file_name, "w");
    9.  
    10.     $count = 0;
    11.  
    12.     foreach($one as $v_one)
    13.     {
    14.         foreach($two as $v_two)
    15.         {
    16.             if ($v_one == $v_two) {                                      //Здесь нужно не сравнение, а значения, которые содержат строку из второго массива
    17.                 $del = unset($one[$v_one]);
    18.                 fwrite($file_write, $del);
    19.                 global $count++;
    20.             }
    21.         }
    22.     }
    23.  
    24.     echo "Удалено " . $count . " совпадений";
    25.  
    26.     // Закрываем первый файл
    27.     fclose($file_write);
    --- Добавлено ---
    я не совсем знаком с синтаксисом думаю что запись fwrite($file_write, $del); - неверна
     
  7. konstantin.sirin

    konstantin.sirin Новичок

    С нами с:
    4 апр 2019
    Сообщения:
    6
    Симпатии:
    0
    после отработки скрипта
    Код (Text):
    1.     $one_file_name = "DFM830011S83005_19031.xml";
    2.     $two_file_name = "VFM830011S83005_19031.xml";
    3.    
    4.     $one = file($one_file_name);
    5.     $two = file($two_file_name);
    6.    
    7.     // Открываем первый файл для записи
    8.     $file_write = fopen($one_file_name, "w");
    9.    
    10.     $count = 0;
    11.    
    12.     for($i = 0; $i < (count($one) - 1); $i++) {
    13.         echo($one[$i]);
    14.     }
    данные первого файла удаляются полностью почему-то но выводит что там было
    --- Добавлено ---
    заносит в массив почему то удаляя все теги(((
     
  8. Babka_Gadalka

    Babka_Gadalka Новичок

    С нами с:
    16 фев 2019
    Сообщения:
    148
    Симпатии:
    18
    Адрес:
    Москва, Пушкина, Избушкина, 2й этаж душечка.
    PHP:
    1. <?php
    2.  
    3. $name1 = 'DFM830011S83005_19031.xml';
    4. $name2 = 'VFM830011S83005_19031.xml';
    5.  
    6.     file ( __DIR__ . DIRECTORY_SEPARATOR . $name1 ),
    7.     file ( __DIR__ . DIRECTORY_SEPARATOR . $name2 )
    8. ) );
    9.  
    10. foreach ( $array AS $k => $a )
    11. {
    12.     if ( strpos ( $a, '<N_ZAP>1213</N_ZAP>' ) !== false )
    13.     {
    14.         unset ( $array[$k] );
    15.     }
    16. }
    17.  
    18. print_r ( $array );
     
  9. konstantin.sirin

    konstantin.sirin Новичок

    С нами с:
    4 апр 2019
    Сообщения:
    6
    Симпатии:
    0

    есть такой момент, что во 2 файле строки вида <N_ZAP>1213</N_ZAP>, могут содержать разные значения, к примеру <N_ZAP>105</N_ZAP>, <N_ZAP>10855</N_ZAP>
    --- Добавлено ---
    и не одно, а в каждой строке свое
     
  10. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.379
    Симпатии:
    12
    Адрес:
    Дмитров, МО