2014-11-18 3 views
1

Мне нужно выполнить задачу импорта данных в mysql из текстового файла с использованием php-кода, да, это звучит так просто, и я уже делал это раньше, как импорт данных из файла csv, из файла excel или любого текстового файла, где данные разделяется любым разделителем. Но в моем текущем случае нет никакого разделителя только двух пробелов и фиксированной длины поля. Для ПРИМЕР-как импортировать данные из текстового файла без разделителя или разделителя?

table field 
|------|-----------|-----------|-------------| 
| id(8)| name(50) | state(15) | category(10)| 
|------|-----------|-----------|-------------| 
|  |   |   |    | 

выборки данных upload.txt файл-

:: Формат ::

ID ИМЯ АДРЕС КАТЕГОРИЯ

10719922 Union Bank of India         delhi   normal  
10719956 State Bank of India         mumbai   normal  
10719522 HDFC Bank           gujrat   high   
10759924 ICICI Bank           goa    normal  

Теперь вы можете понять формат данных текстовый файл, т.е. длина поля + два пробела, длина поля + два пробела и т. д. Проблема в том, что данные не совпадают с размером поля, а затем снова пробелы - заявка, чтобы заполнить длину поля, поэтому два пробела недоступны в качестве разделителя. Подобно тому, как первый из идентификаторов данных имеет 8-значные данные, чем два пробела и длину имени 50, но данные имеют только 19 символов, поэтому есть 31 пробел, чтобы завершить длину 50 после этого двух пробелов, затем следующего поля. Таким образом, у меня нет разделителя или синтаксиса (а не длина + 2 пробела) для идентификации отдельных полевых данных. Я очень смущен, как импортировать эти данные в MySQL с помощью php-скрипта. кто-то думает, что это может случиться. Пожалуйста, мне нужна идея или PHP-код, чтобы справиться с этой ситуацией. Спасибо

ответ

1

Это не должно быть более сложным, чем это:

<?php 
$input = <<<END 
10719922 Union Bank of India         delhi   normal  
10719956 State Bank of India         mumbai   normal  
10719522 HDFC Bank           gujrat   high  
10759924 ICICI Bank           goa    normal  
END; 

$def = array(
    "id" => 8, 
    "name" => 50, 
    "state" => 15, 
    "category" => 10 
); 

foreach (explode(PHP_EOL, $input) as $line) { 
    foreach ($def as $field => $length) { 
     $value = substr($line, 0, $length + 2); 
     $line = substr($line, $length + 2); 

     print $field.' = '.trim($value).PHP_EOL; 
    } 

    print '----------------------------------------'.PHP_EOL; 
} 
?> 

Основная идея - создать определение формата в $def, а затем обрабатывать все строки в соответствии с этим определением формата.

Выполнение этого кода даст выход ниже. Измените фактическую реализацию в соответствии с вашими потребностями.

id = 10719922 
name = Union Bank of India 
state = delhi 
category = normal 
---------------------------------------- 
id = 10719956 
name = State Bank of India 
state = mumbai 
category = normal 
---------------------------------------- 
id = 10719522 
name = HDFC Bank 
state = gujrat 
category = high 
---------------------------------------- 
id = 10759924 
name = ICICI Bank 
state = goa 
category = normal 
---------------------------------------- 
+1

Thanks Robby, Удивительное решение. Я сделал это с помощью вашего кода. –

0

Вы можете использовать функцию preg_split(), и взорвать/строку/строки строки по >= 2 spaces:

$line = '10719922 Union Bank of India         delhi   normal'; 
$m = preg_split('~(\h{2,})~', $line); 
print_r($m); 

demo

Смежные вопросы