2012-02-09 3 views
0

Рассмотрим следующий фрагмент данных CSV из «NASDAQ.csv»Импорт CSV данных в MySQL

"Symbol,""Name"",""LastSale"",""MarketCap"",""ADR TSO"",""IPOyear"",""Sector"",""industry"",""Summary Quote"",";; 
"FLWS,""1-800 FLOWERS.COM, Inc."",""2.9"",""81745200"",""n/a"",""1999"",""Consumer Services"",""Other Specialty Stores"",""http://www.nasdaq.com/symbol/flws"",";; 
"FCTY,""1st Century Bancshares, Inc"",""4"",""36172000"",""n/a"",""n/a"",""Finance"",""Major Banks"",""http://www.nasdaq.com/symbol/fcty"",";; 
"FCCY,""1st Constitution Bancorp (NJ)"",""8.8999"",""44908895.4"",""n/a"",""n/a"",""Finance"",""Savings Institutions"",""http://www.nasdaq.com/symbol/fccy"",";; 

Я пытаюсь импортировать символ, сектор и промышленность в таблицу MySQL с соответствующими полями:

$path = "NASDAQ.csv"; 
$row = 1; 
if (($handle = fopen($path, "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) { 
    $row++; 
    $entries[] = $data ; 
    } 
    fclose($handle); 
} 

foreach ($entries as $line) { 
    db_query(" 
    INSERT INTO us_stocks (symbol, name, sector, industry) 
    VALUES ('%s', '%s', '%s', '%s', '%s')", 
    $line[0], $line[1], $line[6], $line[7] 
); 
} 

Результат, однако, не то, что я ожидал. В базе данных заполняется только поле «Символ» и даже не корректно:

symbol  name sector industry 
---------------------------------- 
Symbol,"Na 
FLWS,"1-80 
FCTY,"1st 
FCCY,"1st 

Что я делаю неправильно?

[править]

Если я print_r ($ записей), результат выглядит

Array (
    [0] => Array(
    [0] => Symbol,"Name","LastSale","MarketCap","ADR TSO","IPOyear","Sector","industry","Summary Quote",;; 
) 
    [1] => Array(
    [0] => FLWS,"1-800 FLOWERS.COM, Inc.","2.9","81745200","n/a","1999","Consumer Services","Other Specialty Stores","http://www.nasdaq.com/symbol/flws",;; 
) 
    [2] => Array(
    [0] => FCTY,"1st Century Bancshares, Inc","4","36172000","n/a","n/a","Finance","Major Banks","http://www.nasdaq.com/symbol/fcty",;; 
) 
) 

[edit2]

Я удалил первую строку CSV, как это было предложено. Теперь у меня очень быстрый и грязный способ почти выполнить то, что я хочу. В принципе, эта вещь испортится всякий раз, когда в ней есть название компании с «, Inc». Поэтому я просто «приклеиваю» его к названию выше: $ data [1] = $ data [1]. $ данных [2]:

$path = "NASDAQ.csv"; 
$row = 1; 
if (($handle = fopen($path, "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, ";;")) !== FALSE) { 
    if ($row < 100) { 
     $row++; 
     $data = explode(',', $data[0]); 
     if (substr($data[2], 0, 1) == ' ') { 
     $data[1] = $data[1] . $data[2]; 
     unset($data[2]); 
     } 
     $entries[] = $data ; 
    } 
    } 
    fclose($handle); 
} 

print_r ($ записей) теперь дает:

[0] => Array 
    (
     [0] => FLWS 
     [1] => "1-800 FLOWERS.COM Inc." 
     [3] => "2.9" 
     [4] => "81745200" 
     [5] => "n/a" 
     [6] => "1999" 
     [7] => "Consumer Services" 
     [8] => "Other Specialty Stores" 
     [9] => "http://www.nasdaq.com/symbol/flws" 
     [10] => 
    ) 

Заключительная проблема: я не знаю, как пронумеровать ключи. Таким образом, 3 в 2, 4 в 3, и т.д., так что выход выглядит следующим образом:

[0] => Array 
    (
     [0] => FLWS 
     [1] => "1-800 FLOWERS.COM Inc." 
     [2] => "2.9" 
     [3] => "81745200" 
     [4] => "n/a" 
     [5] => "1999" 
     [6] => "Consumer Services" 
     [7] => "Other Specialty Stores" 
     [8] => "http://www.nasdaq.com/symbol/flws" 
     [9] => 
    ) 

Любая помощь будет принята с благодарностью!

+1

Я предположил бы, что он должен d o с двойными кавычками, используемыми в вашем CSV-файле. Четвертый аргумент 'fgetcsv()' ('$ enclosure') можно установить в' '\" \ "" ', чтобы убедиться, что это так. – Crontab

ответ

1

Как сказал Кронтаб, вероятно, это проблема с кавычками. Попробуйте:

foreach ($entries as $line) { 

    // Escape (see mysql_real_escape_string too) and remove double quotes 
    foreach ($line as $k => $v) $line[$k] = mysql_escape_string(trim($v, '"')); 

    // Rebuild array 
    $line = array_values($line); 

    db_query(" 
    INSERT INTO us_stocks (symbol, name, sector, industry) 
    VALUES ('%s', '%s', '%s', '%s', '%s')", 
    $line[0], $line[1], $line[6], $line[7] 
); 

} 

PS: Я не знаю, если вы уже избежать строки в db_query().

+0

я уже делаю. Однако он не работает. И ни один из них не является вашим кодом. Теперь он просто читает FLWS, \ "1-8 и т. Д. Из-за двойного экранирования. Возможно, было бы лучше просто использовать регулярное выражение для удаления всех одиночных и двойных кавычек из каждой строки данных? – Pr0no

+0

'trim ($ v, '' ')' удаляет одиночные или множественные двойные кавычки из начала и конца строки. Поэтому я боюсь, что 'fgetcsv()' не может правильно проанализировать этот CSV. попробовал перед запросом и без моего кода увидеть выходные данные 'print_r ($ line)'? Правильно ли расставлены поля? –

+0

См. edit :) – Pr0no

2

Я бы сказал, что данные не являются «истинно» CSV. .

"FLWS", "1-800 FLOWERS.COM, Inc" " "" 2.9 "", должно быть: "FLWS", "1-800 FLOWERS.COM, INC"," 2.9. "-... кавычки должны обернуть отдельные поля запятых отделяя каждое поле Обычно числовые поля не обернуты

в зависимости от того, как загрузить данные, запятой находится в данном может спутать (т.е. FLOWERS.COM , INC»

Кстати - если это действительно CSV - посмотреть на: http://dev.mysql.com/doc/refman/5.1/en/load-data.html

+0

Ну, это не самый лучший файл csv, который я когда-либо видел ... но это то, что доступно на nasday.com, и я не мог найти другого источника для импорта символов тикера всех акций США (У меня есть другие csv, подобные AMEX, NYSE, с того же сайта). Могу ли я просто удалить все «и» из всех полей? – Pr0no

+0

1-я строка должна иметь опечатку на ней, так как нет разделителя между символом и именем вне кавычек. Я бы просто заменил все «» на « (изменить или tr 2 x кавычки на 1 x цитату) и использовать данные загрузки infile, пропуская 1-ю строку, и указать столбцы для загрузки. Я * гарантирую *, если вы перейдете с данными загрузки данных, ваши вставки будут монстрами быстро. – FreudianSlip

+0

Наверное, но пока я думаю, что взломать что-то вместе в php работает быстрее для меня ... почти там. Кстати, пожалуйста, посмотрите мой последний вопрос - как перенумеровать ключи - если у вас есть время. – Pr0no

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