Использование
$lines = explode(PHP_EOL, $csv);
$data = array();
foreach ($lines as $line)
$data[] = explode("\t", $line);
(если он разделен табуляцией, как это выглядит в вашем примере) и запустите его через два цикла.
EDIT
Вот проверенный код:
$csv1 = <<<TXT
1900 1901 1902
Norway 3 2
Sweden 1 3 3
Denmark 5 2 3
TXT;
$csv2 = <<<TXT
1900 1901 1902
Norway 1 3 4
Sweden 1 2
Iceland 1 6 3
TXT;
$csvs = array(
'IndicatorA_Name' => $csv1,
'IndicatorB_Name' => $csv2);
/* of course, if you're pulling this from csv files,
you need to modify it accordingly, e.g.
$files = array('IndicatorA_Name', 'IndicatorB_Name', ...);
$csvs = array();
foreach ($files as $f)
$csvs[] = file_get_contents($path . '/' . $f . '.csv');
or use file(), then you don't need the first `explode` line later */
$data = array();
foreach ($csvs as $indicator => $csv) {
$lines = explode(PHP_EOL, $csv);
$header = explode("\t", array_shift($lines));
foreach ($lines as $line) {
$fields = explode("\t", $line);
for ($i = 1; $i < count($fields); $i++) {
$data[$fields[0]][$header[$i]][$indicator] = $fields[$i];
}
}
}
$rows = array();
foreach ($data as $country => $years) {
foreach ($years as $year => $values) {
$str = sprintf(PHP_EOL."('%s', '%d'", mysql_real_escape_string($country), intval($year));
foreach (array_keys($csvs) as $indicator) {
if (isset($values[$indicator]))
$str .= sprintf(", '%s'", mysql_real_escape_string(trim($values[$indicator])));
else
$str .= ", ''";
}
$rows[] = $str . ")";
}
}
$sql = "INSERT INTO table_name (".implode(',', array_keys($csvs)).") VALUES ".
implode(',', $rows);
$ sql сейчас
INSERT INTO table_name (IndicatorA_Name,IndicatorB_Name) VALUES
('Norway', '1900', '3', '1'),
('Norway', '1901', '2', '3'),
('Norway', '1902', '', '4'),
('Sweden', '1900', '1', '1'),
('Sweden', '1901', '3', '2'),
('Sweden', '1902', '3', ''),
('Denmark', '1900', '5', ''),
('Denmark', '1901', '2', ''),
('Denmark', '1902', '3', ''),
('Iceland', '1900', '', '1'),
('Iceland', '1901', '', '6'),
('Iceland', '1902', '', '3')