2010-06-15 5 views
3

Я пытаюсь импортировать это:Как разделить файл, разделенный пробелом?

http://en.wikipedia.org/wiki/List_of_countries_by_continent_%28data_file%29

, который имеет формат, как:

AS AF AFG 004 Afghanistan, Islamic Republic of 
EU AX ALA 248 Åland Islands 
EU AL ALB 008 Albania, Republic of 
AF DZ DZA 012 Algeria, People's Democratic Republic of 
OC AS ASM 016 American Samoa 
EU AD AND 020 Andorra, Principality of 
AF AO AGO 024 Angola, Republic of 
NA AI AIA 660 Anguilla 

если я сделать

<? explode(" ",$data"); ?> 

работает отлично, кроме стран с более чем 1 слово.

Как я могу разбить его, поэтому я получаю первые 4 бита данных (символы/ints), а 5-й бит данных остается тем, что остается?

это в PHP

спасибо

+0

есть ли у вас запятая после названия каждой страны? – nik

ответ

11

explode функция принимает необязательный параметр предела. Измените свой функциональный вызов на:

<?php explode(" ", $data, 5); ?> 

и вы получите название страны как последний элемент массива, содержащий пробелы.

+0

Ты бил меня на четыре секунды ... Я думаю, ты заслуживаешь получить лучший ответ, а не меня. – hbw

+1

+1, но не используйте короткие открытые теги –

+0

это не будет работать, если страна Чехия – nik

0

Вы можете использовать preg_match, и ваш текст будет в $match[5];

<?php 
$str = 'AS AF AFG 004 Afghanistan, Islamic Republic of'; 
$chars = preg_match('/([A-Z]*)\ ([A-Z]*)\ ([A-Z]*)\ ([0-9]*)\ (.*)\ /', $str, $match); 
print_r($match); 
?> 
+2

Нет необходимости скрывать пространство. – Gumbo

+0

Также в этом шаблоне все, кроме пробелов, необязательно (оно соответствует строке с 5 пробелами).В этом случае это может быть не проблема, но, насколько это возможно, помогает избежать неожиданных результатов. –

3

Использование unpack:

$format = "A2cont/x/A2alpha2/x/A3alpha3/x/A3num/x/a*eng"; 
$line = "AS AF AFG 004 Afghanistan, Islamic Republic of"; 
$ar = unpack($format, $line); 

Он производит:

array (
    'cont' => 'AS', 
    'alpha2' => 'AF', 
    'alpha3' => 'AFG', 
    'num' => '004', 
    'eng' => 'Afghanistan, Islamic Republic of', 
) 

Это имеет преимущество создания ассоциативного массива (обратите внимание на текст перед косой чертой), и предупреждение, если вход является недействительным.

+0

+1 для показа мне использования функции распаковки :) – Max

0

Может быть sscanf также может делать то, что вам нужно:

<?php 
// in my example I loaded the data in an array line by line 
$lines = file('sscanf_data.txt'); 

foreach($lines as $line) { 
    $data = array(); 
    // define the format of the input string, assign the 
    // extracted data to an associative array 
    sscanf($line, "%s %s %s %s %[^.]", 
     $data['col_1'], 
     $data['col_2'], 
     $data['col_3'], 
     $data['col_4'], 
     $data['col_5']); 

    // dump array contents 
    print_r($data); 
} 

Выход:

Array 
(
    [col_1] => AS 
    [col_2] => AF 
    [col_3] => AFG 
    [col_4] => 004 
    [col_5] => Afghanistan, Islamic Republic of 

) 
... 

Хорошая вещь, что если вы храните данные в ассоциативном массиве у вас уже есть пары значения поля для вставки их в БД.

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