自动跳过csv文件php中的标题行

时间:2016-06-30 19:40:09

标签: php

我正在处理csv文件可能包含标题的问题,那么我们如何跳过该标题或额外信息并跳转到主数据(csv数据)

CSV数据可能会像:

   **Heading 1**
This is some extra text before Data
date: xx-xx-xxxx
country data: A,B,C

     *Then here starts the Data(comma separated values)*  

Col1,col2,col3, 
dataCol1,datacol2,datacol3 ....

那么我们如何跳过主数据并处理该数据

任何帮助将不胜感激..因为我尝试但无法解决它 谢谢

2 个答案:

答案 0 :(得分:0)

您需要找到某种分隔符或模式,您可以使用它来指示数据的开始位置。例如:

  • 你知道标题是否总是一定数量的行?
  • 在你的例子中是否总是有一个空白行?

一旦你知道,你可以测试文件是否包含该模式/分隔符,然后跳到csv部分。

  

谢谢,但不确定,标题部分可能存在或不存在...... - Abzkn

这就是诀窍 - 你需要找出它存在的条件。然后测试那些条件。例如,如果您知道标题总是4行而下一行是空行,您可以这样做:

<?php
$f = file_get_contents($filename); //get everything in the file being processed

$file_lines = explode("\n", $f); //break up each line into an array we can process

$start_line = 0; //assume the header is not present and we'll start processing from line 1

if($file_lines[4] == ''){
    //header is present, so start processing from line 5
    $start_line = 5;
}

for($l = $start_line;$l < count($file_lines;$l++){
    //process each line
}

&GT;

答案 1 :(得分:0)

这绝不是一个完美的解决方案,因为你的问题中有一些未知数 - 因此我必须做出一个假设:csv列数据的行数将多于元数据/标题行。为了帮助启发,我们还将排除所有“空”行。

如果我们可以做出这个假设,那么我们可以做类似以下的事情:

<?php

// define filepath... optionally validate
// with `is_file()` and `is_writable()`
$file = __DIR__ . '/data.csv';

// create an SplFileObject
$csv = new SplFileObject($file);

// set some flags to read file transparently
// as a csv. drop `SKIP_EMPTY` will ignore all
// blank lines as specified above
$csv->setFlags(
    SplFileObject::DROP_NEW_LINE |
    SplFileObject::READ_AHEAD    |
    SplFileObject::SKIP_EMPTY    | 
    SplFileObject::READ_CSV
);

// init an empty array to store rows
$rows  = [];

// an `SplFileObject` allows iteration
// over its contents with `foreach`.
foreach ($csv as $row) {
    // stash each row into a sub-array
    // indexed by its length (number of columns)
    $rows[count($row)][] = $row;
}

// `max()` will return the biggest sub-array
// which will be the column data according 
// to our assumptions stated above
$csvData = max($rows);

var_dump($csvData);

如果$file的内容包含:

       **Heading 1**
This is some extra text before Data
date: xx-xx-xxxx
country data: A,B,C

     *Then here starts the Data(comma separated values)*

Col1,col2,col3
dataCol1,datacol2,datacol3
dataCol1,datacol2,datacol3
dataCol1,datacol2,datacol3

我们应该期待以下结果:

    Array
(
    [0] => Array
        (
            [0] =>     country data: A
            [1] => B
            [2] => C
        )

    [1] => Array
        (
            [0] =>     Col1
            [1] => col2
            [2] => col3
        )

    [2] => Array
        (
            [0] =>     dataCol1
            [1] => datacol2
            [2] => datacol3
        )

    [3] => Array
        (
            [0] =>     dataCol1
            [1] => datacol2
            [2] => datacol3
        )

    [4] => Array
        (
            [0] =>     dataCol1
            [1] => datacol2
            [2] => datacol3
        )

)

看起来很不错 - 除了......行country data: A,B,C已被解析为有效行,因为它还包含两个逗号。这是尝试启发式编程的问题。我不知道这是否会在您的具体用例中出现问题。如果是这样,可能需要对上述方法进行一些改进。

参考文献:

希望这会有所帮助:)