我正在处理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 ....
那么我们如何跳过主数据并处理该数据
任何帮助将不胜感激..因为我尝试但无法解决它 谢谢
答案 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
已被解析为有效行,因为它还包含两个逗号。这是尝试启发式编程的问题。我不知道这是否会在您的具体用例中出现问题。如果是这样,可能需要对上述方法进行一些改进。
参考文献:
希望这会有所帮助:)