Мне нужна помощь PHP, чтобы открыть файл CSV в массив, изменить данные, а затем переписать исходный файл CSV с измененными данными - PullRequest
0 голосов
/ 16 июня 2011

Мне нужно извлечь данные из файла CSV для использования в отчетах. Однако экспортирующее программное обеспечение не имеет возможности экспортировать его в полезный формат. Используя PHP, я хотел бы взять CSV-файл с такими данными, как:

'Time','Month And Year','Count'
'8 Hours','Apr 2011','127'
'6 Hours','Apr 2011','45'
'4 Hours','Apr 2011','23'
'2 Hours','Apr 2011','122'
'8 Hours','Dec 2010','29'
'6 Hours','Dec 2010','8'
'4 Hours','Dec 2010','1'
'2 Hours','Dec 2010','64'
etc...

И превратить это в это:

Time,Dec 2010,Jan 2011,Feb 2011,Mar 2011,Apr 2011,May 2011
8 Hours,126,47,115,77,127,110
6 Hours,45,18,62,38,42,31
4 Hours,23,3,11,8,15,18
2 Hours,122,93,185,144,128,70

На данный момент у меня есть код, чтобы открыть файл CSV с помощью fgetcsv () и удалить ненужные символы:

$lines = array();
$tempName = array();
$tempCount = array();
$tempTitle = array();
$items = array();

$fp = fopen('../data/data2.csv','r') or die("can't open data2.csv");

while($lines = fgetcsv($fp,4096,"\\n")) {

  for ($i = 0, $j = count($lines); $i < $j; $i++) {

    $lines[$i] = str_replace('\'', '', $lines[$i]);
    $lines[$i] = str_replace('A: ', '', $lines[$i]);
    $lines[$i] = str_replace('B: ', '', $lines[$i]);
    $lines[$i] = str_replace('C: ', '', $lines[$i]);
    $lines[$i] = str_replace('D: ', '', $lines[$i]);

  }
}

fclose($fp) or die("can't close volume2.csv");

При этом строки CSV-файла сохраняются в виде строк с разделителями-запятыми, в результате чего массив $ lines выглядит следующим образом:

Time,Month And Year,Count
8 Hours,Apr 2011,127
6 Hours,Apr 2011,45
4 Hours,Apr 2011,23
2 Hours,Apr 2011,122
8 Hours,Dec 2010,29
6 Hours,Dec 2010,8
4 Hours,Dec 2010,1
2 Hours,Dec 2010,64
etc...

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

Я пытался использовать:

for ($h = 0, $k = count($lines); $h < $k; $h++) {
  $items = preg_split("/[,]+/",$lines[$h]);
}

, а затем помещая правильные данные в массивы, используя оператор case, но он зависает, поэтому я, должно быть, что-то делаю не так. (Не говоря уже о том, что этот код не оптимизирован.)

Есть идеи, куда я могу пойти отсюда? Спасибо!

1 Ответ

4 голосов
/ 16 июня 2011

Вы неправильно используете fgetcsv() и считываете его сразу несколькими строками.

Измените свой код так, чтобы он использовал:

while($line = fgetcsv($fp)) {

}

и в каждой итерации при разборестрока за раз.

Если вы хотите записать это обратно в файл CSV, вы можете сделать что-то вроде:

$out = array();
while($line = fgetcsv($fp)) {
    // modify fields as you need to
    $out[] = implode(",", $line);
}

// now you can write implode("\n", $out) out as the modified data
...