下面的代码是我用来从csv文件中获取整个数据列的代码。(有很多列,但我只需要第2列)。这段代码将把所有数据放入名为$cbsmin
的数组中。我需要做的是跳过每个文件中的第一个数据,因为它是类别名称,而不是实际的数据。
怎样才能做到最好呢?
for($i=0;$i<count($files);$i++){
if (($handle = fopen($files[$i], "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$cbsmin[] = $data[2];
}
fclose($handle);
}
}
使用一个简单的标志来标记它是否为第一行。如果是,则将标志重置为false并跳过该行。
$isfirst = true;
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
if ($isfirst)
{
$isfirst = false;
continue;
}
$cbsmin[] = $data[2];
}
只执行一个
fgetcsv($handle, 1000, ",");
在进入while循环之前抛出一个额外的read
for($i=0;$i<count($files);$i++){
if (($handle = fopen($files[$i], "r")) !== FALSE) {
// eat the header
fgetcsv($handle, 1000, ",");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$cbsmin[] = $data[2];
}
fclose($handle);
}
}
我为此使用的另一种技术是将标题行用于数据中的键。如果标题行随时间推移和文件之间保持一致,则此方法有效。for($i=0;$i<count($files);$i++){
if (($handle = fopen($files[$i], "r")) !== FALSE) {
// eat the header
$header = fgetcsv($handle, 1000, ",");
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$data = array_combine($header, $data);
$cbsmin[] = $data["Customer Name"];
}
fclose($handle);
}
}
如果你要用很多字段做一些重要的事情,那么就不必使用字段偏移量了。