2011-06-13 68 views
2

我有一個格式相對簡單的Excel/CSV文件。從CSV抓取,序列化所選字段並修改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中呢?

回答

3

因爲這個問題改了一下,我要去給一個新的答案。希望這可以幫助。

<?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; 

?> 
+0

這很完美。謝謝! – Dan 2011-06-20 08:41:20

3

在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; 

?> 
+0

嘿!感謝您花時間提供兩種解決方案。我將在PHP上工作,因爲這會更靈活,但Excel公式會產生一個錯誤 - Excel不喜歡它? – Dan 2011-06-14 07:44:32

+1

下面是一個鏈接到一個excel文件的例子,完全可以工作:http://www.mediafire.com/?7b5d4rbu42rd3yi或http://www.megaupload.com/?d=2C1SZCG5該文件在單元格A1上排序演示如何刪除不需要的行。如果您將整個頁面複製並粘貼到新的Excel表格中,則可以在最後階段擺脫數據過濾。一次快速數據清理時,excel方法總是更快,但是如果你一遍又一遍地執行,php會更加靈活。希望這可以幫助! – jous 2011-06-14 10:38:32

+0

再次感謝 - 不知道爲什麼ny本地從零開始版本不起作用。我認爲這對我來說必須是PHP,因爲PHP中的'serialize()'函數產生了一個與excel差不多的輸出。 '一個:2:{I:0;一個:3:{I:1; S:3: 「120」; I:2; S:4: 「12.5」; I:3; S:8:「21- 65-54 「;} I:1;一個:3:{I:1; S:3:」 122 「; I:2; S:2:」 13 「; I:3; S:8:」 21- 65-54「;}}' - 我現在要檢查PHP版本。 – Dan 2011-06-14 12:46:56