2017-02-10 17 views
2

я получаю файл ежедневно с некоторыми данными:Выясните файл или разделители регулярных выражений

B024560HERR S, KARL-HEINZ   FAO031 D  F 18.07.17 01.08.17 14 LH 1162 18.07.17 10:30 12:35 FRA FAO FRA  1 LH 1163 01.08.17 FAO  03.01.17 1 
    Frühbucher 10% 
    inkl. Reiseleitung 
    und Transfer ab/bis Flughafen 
    *REPEATER, BITTE ZIMMERGEGENÜBER DER BAR 3ER 
    UNVERBINDLICHER KUNDENWUNSCH 
B024560HERR S, KARL-HEINZ   FAO031 D  F 18.07.17 01.08.17 14 LH 1162 18.07.17 10:30 12:35 FRA FAO FRA  1 LH 1163 01.08.17 FAO  03.01.17 1 
B024560FRAU S, MARIA   FAO031 D  F 18.07.17 01.08.17 14 LH 1162 18.07.17 10:30 12:35 FRA FAO FRA  1 LH 1163 01.08.17 FAO  03.01.17 2 

Ссылка на этот пример файла: https://www.dropbox.com/s/c39km8htjqq9q4t/example.txt?dl=1

Мне нужно импортировать его в базу данных MySQL.

Так что это должно быть разделено, как это (с использованием | в качестве разделителя):

B024560 | HERR S, KARL-HEINZ |  FAO031 | D | F | 18.07.17 | 01.08.17 | 14 | LH 1162 | 18.07.17 | 10:30 | 12:35 | FRA | FAO | FRA  | 1 |LH 1163 | 01.08.17 | FAO | 03.01.17 | 1 | 
    Frühbucher 10% 
    inkl. Reiseleitung 
    und Transfer ab/bis Flughafen 
    *REPEATER, BITTE ZIMMERGEGENÜBER DER BAR 3ER 
    UNVERBINDLICHER KUNDENWUNSCH | 

B024560 | HERR S, KARL-HEINZ  | FAO031 | D  | F | 18.07.17 | 01.08.17 | 14 | LH 1162 | 18.07.17 | 10:30 |12:35 | FRA | FAO | FRA | 1 | LH 1163 | 01.08.17 | FAO | 03.01.17 | 1 | 

B024560 | FRAU S, MARIA |  FAO031 | D | F | 18.07.17 | 01.08.17 | 14 | LH 1162 | 18.07.17 | 10:30 | 12:35 | FRA | FAO | FRA |  1 | LH 1163 | 01.08.17 | FAO | 03.01.17 | 2 

Самое лучшее, что я сделал, было с this regex:

\s{2,} 

Так что моя проблема заключается в том, как я могу узнать делит файл? Или есть другой или лучший способ сделать это? Идея состоит в том, чтобы прочитать этот файл с php и импортировать в базу данных mysql.

+0

Вы можете не читать файл с 'php' или' java' и огня 'insert' запросов к БД? –

+1

Извините, я не понимаю ваше предложение. Как php «знает», что является файловым делителем? – Mary

+0

Я бы усекал несколько пробелов в одно пространство, а затем разделил каждую строку пробелом. Это было бы намного проще в php, чем в MySQL. –

ответ

1

Это будет делать то, что вы хотите:

(?<=\w)\h{2,}(?=\w)  # horizontal spaces with word character beneath 
| 
(?=HERR|FRAU)    # "HERR" or "FRAU" literally 
| 
\h+(?=\d{2}\.\d{2}\.\d{2}) # a date 
| 
\h+(?=\d{2}:\d{2})   # time of date in xx:xx format 

Смотрите ваши modified demo on regex101.com (и против модификаторов!).


Весь фрагмент кода:

<?php 

$text = <<<EOT 
B024560HERR S, KARL-HEINZ   FAO031 D  F 18.07.17 01.08.17 14 LH 1162 18.07.17 10:30 12:35 FRA FAO FRA  1 LH 1163 01.08.17 FAO  03.01.17 1 
    Frühbucher 10% 
    inkl. Reiseleitung 
    und Transfer ab/bis Flughafen 
    *REPEATER, BITTE ZIMMERGEGENÜBER DER BAR 3ER 
    UNVERBINDLICHER KUNDENWUNSCH 
B024560HERR S, KARL-HEINZ   FAO031 D  F 18.07.17 01.08.17 14 LH 1162 18.07.17 10:30 12:35 FRA FAO FRA  1 LH 1163 01.08.17 FAO  03.01.17 1 
B024560FRAU S, MARIA   FAO031 D  F 18.07.17 01.08.17 14 LH 1162 18.07.17 10:30 12:35 FRA FAO FRA  1 LH 1163 01.08.17 FAO  03.01.17 2 
EOT; 


$regex = '~ 
     (?<=\w)\h{2,}(?=\w) 
     | 
     (?=HERR|FRAU) 
     | 
     \h+(?=\d{2}\.\d{2}\.\d{2}) 
     | 
     \h+(?=\d{2}:\d{2}) 
      ~x'; 

$lines = explode("\n", $text); 
foreach ($lines as $line) { 
    $fields = preg_split($regex, $line); 
    if (count($fields) > 1) { 
     print_r($fields); 
    } 
} 

?> 

Посмотри working on ideone.com.

+0

Привет, спасибо за ваш ответ! Я поставил php-язык и исправил вывод: | LH 1163 01.08.17 | -> | LH 1163 | 01.08.17 | – Mary

+0

@Mary: см. Обновленный ответ. – Jan

0

Вид простого способа.

Используйте (?m)^(B\d+)((?:(?![ ]{9}).)+)[ ]+(.+) и функцию обратного вызова.

Передача $ 1, $ 2, $ 3 для обратного вызова.

Сплит $ 3 с \ s +. $ result = Присоединить разбитый массив с |.
Return = Join $ 1 | $ 2 | + Результат $

(?m) 
^ 
(B \d+)      # (1) 
(       # (2 start) 
     (?: 
      (?! [ ]{9}) 
      . 
    )+ 
)        # (2 end) 
[ ]+ 
(.+)      # (3) 

пример Match выход

** Grp 1 - (pos 0 , len 7) 
B024560 
** Grp 2 - (pos 7 , len 18) 
HERR S, KARL-HEINZ 
** Grp 3 - (pos 35 , len 148) 
FAO031 D  F 18.07.17 01.08.17 14 LH 1162 18.07.17 10:30 12:35 FRA FAO FRA  1 LH 1163 01.08.17 FAO  03.01.17 1