我有一个处理CSV并输出另一个CSV的小脚本。
我想包括一个可选的限制器,以在所需的限制器处停止处理CSV。
我尝试了do while
和这个for loop
都没有用。
csv始终是每一行,而不是csv限制值?
public function get_csv($csv_limit)
{
$file = fopen($this->csv_url, "r");
$rows = [];
$idsColumnsWanted = array_flip(array_keys($this->csv_headers));
$skip_header = 0;
for ($i = 0; $i <= $csv_limit; $i++)
{
while (false !== $fields = fgetcsv($file)) {
if ($skip_header == 0) {
$skip_header++;
continue;
}
$this->csv_rows[] = array_intersect_key($fields, $idsColumnsWanted);
}
}
fclose($file);
}
这也是我的make csv方法。
public function make_csv()
{
$csv_file_name = $this->csv_file_name . "_" . date("Y-m-d_H-i-s",time()) . ".csv";
$csv_init = fopen($csv_file_name, "w");
fputcsv($csv_init, $this->csv_headers, ",", '"');
foreach ($this->csv_rows as $row) {
fputcsv($csv_init, $row);
}
fclose($csv_init);
}
答案 0 :(得分:1)
然后在for
循环中继续使用while
循环读取所有行...
for ($i = 0; $i <= $csv_limit; $i++)
{
while (false !== $fields = fgetcsv($file)) { // This reads the entire file
}
}
相反,您可以只使用while循环,但要计算输出的行数...
$rowCount=0;
while ((false !== $fields = fgetcsv($file)) && $csv_limit > $rowCount++) {
if ($skip_header == 0) {
$skip_header++;
continue;
}
$this->csv_rows[] = array_intersect_key($fields, $idsColumnsWanted);
}
答案 1 :(得分:1)
public function get_csv($csv_limit)
{
$file = fopen($this->csv_url, "r");
$rows = [];
$idsColumnsWanted = array_flip(array_keys($this->csv_headers));
for ($i = 0; $i <= $csv_limit; $i++)
{
$fields = fgetcsv($file);
if ($fields === false) break;
if ($i === 0) continue;
$this->csv_rows[] = array_intersect_key($fields, $idsColumnsWanted);
}
fclose($file);
}