Получить из CSV, сериализовать выбранные поля и изменить CSV - PullRequest
2 голосов
/ 13 июня 2011

У меня есть файл Excel / CSV с относительно простым форматом.

1|2|3|4|10|20|30
 | | | |40|50|60
 | | | |70|80|90
9|8|7|6|01|02|03
 | | | |04|05|06
 | | | |07|08|09
 | | | |10|11|12

Полные строки из 7 полей представляют собой отдельные элементы, а повторяющиеся столбцы 5, 6 и 7 представляют данные, которые я хочу сериализовать. С каждой основной строкой может быть связано любое количество частичных строк.

Таким образом, для вышеприведенного пункта 1 данные для сериализации:

 | | | |10|20|30
 | | | |40|50|60
 | | | |70|80|90

То же самое для элемента 2, хотя содержимое ячейки полностью произвольно, за исключением количества элементов.

Выходные данные будут ниже для получения сериализованных данных, за исключением того, что вместо печати на страницу нужно возвращаться в CSV, как столбец 8, с удалением дополнительных строк (в данном случае 2-3, 5-6) .

Если бы я смог достичь нижеуказанного, то было бы здорово:

<?
$line_1 = array(
    array('1' => '10', '20', '30'), 
    array('1' => '40', '50', '60'), 
    array('1' => '70', '80', '90'), 
);
$line_2 = array(
    array('1' => '01', '02', '03'), 
    array('1' => '04', '05', '06'), 
    array('1' => '07', '08', '09'), 
    array('1' => '10', '11', '12'), 
);
echo serialize($line_1);
echo serialize($line_2);
?>  

Итак, наконец:

1|2|3|4|10|20|30|serialize($line_1)
9|8|7|6|01|02|03|serialize($line_2)

Тогда это был бы просто случай записи в родительскую строку.

Вывод первой строки будет следующим и записан в столбец H:

1|2|3|4|10|20|30|a:3:{i:0;a:3:{i:1;s:2:"10";i:2;s:2:"20";i:3;s:2:"30";}i:1;a:3:{i:1;s:2:"40";i:2;s:2:"50";i:3;s:2:"60";}i:2;a:3:{i:1;s:2:"70";i:2;s:2:"80";i:3;s:2:"90";}}

Возможно ли это сделать в Excel без вмешательства PHP, и если нет, то как это можно сделать в PHP?

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

Поскольку вопрос немного изменился, я собираюсь дать новый ответ. Надеюсь, это поможет.

<?php

  $array_to_serialize = array();
  $output_array = array();
  $in_lines = array();

  $in_csv = '1,2,3,4,10,20,30' . "\r\n" .
            ',,,,40,50,60' . "\r\n" .
            ',,,,70,80,90' . "\r\n" .
            '9,8,7,0,01,02,03' . "\r\n" .
            ',,,,40,11,60' . "\r\n" .
            ',,,,70,80,90' . "\r\n" .
            '9,8,7,6,01,02,03' . "\r\n" .
            ',,,,04,05,06' . "\r\n" .
            ',,,,07,08,09';


  $in_lines = explode("\n", $in_csv);

  while (list(, $line) = each($in_lines)) {

    $line_parts = explode(",", trim($line));

    if ($line_parts[0] != '') {

      if (!empty($beginning_numbers)) {
        $output_array[] = implode(',', $beginning_numbers) . ',' . serialize($matrix_part);
      }

      $beginning_numbers = array_slice($line_parts, 0, 4);
      $matrix_part = array(array_slice($line_parts, 4));

      $output_line = $line_parts;
      $array_to_serialize = array();
    } else {
      $matrix_part[] = array_slice($line_parts, 4);
    }

  }

  $output_array[] = implode(',', $beginning_numbers) . ',' . serialize($matrix_part);

  $out_text = implode("\r\n", $output_array);

  echo $out_text;

?>
3 голосов
/ 13 июня 2011

В Excel скопируйте эту строку на h1:

=IF(A1<>"";IF(A2="";IF(A3="";TEXT(E2;"0")&","&TEXT(F2;"0")&","&TEXT(G2;"0")&","&TEXT(E3;"0")&","&TEXT(F3;"0")&","&TEXT(G3;"0");"");""); "")

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

если вы хотите сделать это в php, вот код для этого (за исключением чтения файлов):

<?php

  $array_to_serialize = array();
  $output_array = array();
  $in_lines = array();

  $in_csv = '1,2,3,4,10,20,30' . "\r\n" .
            ',,,,40,50,60' . "\r\n" .
            ',,,,70,80,90' . "\r\n" .
            '9,8,7,6,01,02,03' . "\r\n" .
            ',,,,04,05,06' . "\r\n" .
            ',,,,07,08,09';


  $in_lines = explode("\n", $in_csv);

  while (list(, $line) = each($in_lines)) {

    $line_parts = explode(",", trim($line));

    if ($line_parts[0] != '') {
      if (!empty($output_line)) {
        $output_array[] = implode(',', $output_line) . ',' . implode(',', $array_to_serialize);
      }

      $output_line = $line_parts;
      $array_to_serialize = array();
    } else {
      $array_to_serialize[] = $line_parts[4];
      $array_to_serialize[] = $line_parts[5];
      $array_to_serialize[] = $line_parts[6];
    }

  }

  $output_array[] = implode(',', $output_line) . ',' . implode(',', $array_to_serialize);

  $out_csv = implode("\r\n", $output_array);

  echo $out_csv;

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...