2012-05-02 2 views
1

У меня есть CSV-файл с тысячами цифр под друг другом. Давайте упростить с помощью этого:Прочитайте файл и добавьте числа в массивные части

4 
7 
1 
9 
3 
3 
8 
6 
2 

То, что я хочу, чтобы вывести массив с 3-х номеров на ключ (интегрировалась запятой):

array (
    [0] => 4,7,1 
    [1] => 9,3,3 
    [2] => 8,6,2 
) 

мне удалось добраться до этого, чтение CSV-:

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

Я просто запутался, где, как я должен до $ строки и $ ячейку, чтобы получить выход я хочу. Не могли бы вы помочь?

+2

почему не просто 'взрываются ("\ п", file_get_contents ("data.csv"));'? –

+4

На самом деле это не csv, учитывая, что нет значений, разделенных запятыми .. может быть немного быстрее, чтобы просто рассматривать его как обычный файл. –

+1

В качестве альтернативы вы можете использовать ['file()'] (http://php.net/file) и ['array_chunk()'] (http://php.net/array_chunk), затем ['array_map()' ] (http://php.net/array_map) (или любое другое количество способов). – salathe

ответ

3

Используйте это, я проверил и работает:

<?php 
$path = "data.csv"; 
$array = explode("\n", file_get_contents("data.csv")); 
$numbers = array(); 
foreach(array_chunk($array, 3) as $number){ 
    $numbers[] = implode(", ", $number); 
} 
print_r($numbers); 
?> 
+0

Это замечательно, спасибо! – Pr0no

+0

Я сделал это в своем localhost @ehime –

+0

Не то же самое, что и мой o_O – Shikiryu

1

Вы должны объявить ячейку вне цикла или будет ВСЕГДА сброс ...

Вот необходимый код:

$path = "data.csv"; 
$row = 0; 
$cell = 0; 
if (($handle = fopen($path, "r")) !== FALSE) { 
    while (($data = fgetcsv($handle, 1000, "\r\n")) !== FALSE) { 
    $table[$row][$cell] = $data[0]; 
    $row += $cell == 2 ? 1 : 0; //If its last cell, increase row, else do nothing 
    $cell = $cell == 2 ? 0 : $cell+1; //if its last cell, reset to 0, else add 1 
    } 
    fclose($handle); 
} 

Я надеюсь, что его легко понять, для вас

+0

Это не сработает, fgetcsv может использовать только один символ в качестве разделителя. – ehime

+0

Я только что отредактировал оригинальный код, считая, что он работал для чтения файла. Если вы думаете, что это действительно не работает, прокомментируйте вопрос, а не ответьте. – Kyborek

2

Меньший (даже если вы уже приняли другой ответ), но не означает, что он «лучше» (поскольку он не так легко читается). Тем не менее вы можете узнать некоторые приемы из него:

$path = "data.csv"; 
$datas = array_chunk(explode("\n",file_get_contents($path)),3); 
array_walk($datas, create_function('&$v,$k', '$v = implode(\', \', $v);')); 
var_dump($datas); 

путь лучше, чем предыдущий:

$path = "data.csv"; // path to the file 
$datas = explode("\n",file_get_contents($path)); 
// $datas contains an array with each csv line as an array row 
$finalArray = array(); // empty array we will fill 
$datas = array_chunk($datas, 3); // http://fr.php.net/manual/en/function.array-chunk.php 
foreach($datas as $data){ 
    $finalArray[] = implode(', ', $data); 
} 
var_dump($finalArray); 

Предыдущая одно:

$path = "data.csv"; // path to the file 
$row = 0; // initializing 
$datas = explode("\n",file_get_contents($path)); 
// $datas contains an array with each csv line as an array row 
$finalArray = array(); // empty array we will fill 
// Let's loop $datas \o/ 
foreach($datas as $index => $data){ // 
    $finalArray[$row] = isset($finalArray[$row]) ? $finalArray[$row].', '.$data : $data; // filling the array 
    if(($index+1)%3 == 0) $row++; // We jump from a row to another every 3 lines 
} 

var_dump($finalArray); 
1

И вот мой код :

//filter for empty lines 
function remove_empty($e){ 
if(trim($e)!="") return true; 
} 

//reading the csv file and building the integer array 
$arr = array_filter(explode("\r\n",file_get_contents("test.csv")),"remove_empty"); 
//new array initialization 
$newArr = array(); 
//selecting 3 values in one loop 
for($i=0;$i<count($arr);$i=$i+3){ 
    $newArr[] = implode(",",array($arr[$i],$arr[$i+1],$arr[$i+2])); 
} 

print_r($newArr); 
Смежные вопросы