[英]how do i parse a csv file to grab the column names first then the rows that relate to it?
here is my csv 这是我的csv
column1,column2,column3,column4,column5
column1_row1,column2_row1,column3_row1,column4_row1,column5_row1
column1_row2,column2_row2,column3_row2,column4_row2,column5_row2
column1_row3,column2_row3,column3_row3,column4_row3,column5_row3
column1_row4,column2_row4,column3_row4,column4_row4,column5_row4
column1_row5,column2_row5,column3_row5,column4_row5,column5_row5
column1_row6,column2_row6,column3_row6,column4_row6,column5_row6
column1_row7,column2_row7,column3_row7,column4_row7,column5_row7
column1_row8,column2_row8,column3_row8,column4_row8,column5_row8
column1_row9,column2_row9,column3_row9,column4_row9,column5_row9
first row is the column names of course. 第一行当然是列名。 i tried fgetcsv() but all that would do is display all rows.
我试过fgetcsv(),但所有会做的就是显示所有行。 rather than what i want.
而不是我想要的。 how can i do it?
我该怎么做?
so if i were to put the data into an array at the end i would be able print out a table format of the data just like its shown in excel. 因此,如果我将数据放入最后的数组中,我将能够打印出数据的表格格式,就像在excel中显示的那样。
thanks 谢谢
this is my sample: 这是我的样本:
$filename = "upload/sample.csv";
if (($handle = fopen($filename, 'r')) !== FALSE)
{
while (($row = fgetcsv($handle, 1000, ",")) !== FALSE)
{
print_r($row);
}
}
this is my output: (i put the $row into a pre so i can show it) 这是我的输出:(我把$行放到pre中,所以我可以显示它)
Array
(
[0] => column1
[1] => column2
[2] => column3
[3] => column4
[4] => column5
column1_row1
[5] => column2_row1
[6] => column3_row1
[7] => column4_row1
[8] => column5_row1
column1_row2
[9] => column2_row2
[10] => column3_row2
[11] => column4_row2
[12] => column5_row2
column1_row3
[13] => column2_row3
[14] => column3_row3
[15] => column4_row3
[16] => column5_row3
column1_row4
[17] => column2_row4
[18] => column3_row4
[19] => column4_row4
[20] => column5_row4
column1_row5
[21] => column2_row5
[22] => column3_row5
[23] => column4_row5
[24] => column5_row5
column1_row6
[25] => column2_row6
[26] => column3_row6
[27] => column4_row6
[28] => column5_row6
column1_row7
[29] => column2_row7
[30] => column3_row7
[31] => column4_row7
[32] => column5_row7
column1_row8
[33] => column2_row8
[34] => column3_row8
[35] => column4_row8
[36] => column5_row8
column1_row9
[37] => column2_row9
[38] => column3_row9
[39] => column4_row9
[40] => column5_row9
)
For reading it all at once you can use: 要立即阅读所有内容,您可以使用:
$csv = array_map("str_getcsv", file("file1.csv",FILE_SKIP_EMPTY_LINES));
$keys = array_shift($csv);
To turn all the rows into a nice associative array you could then apply: 要将所有行转换为一个漂亮的关联数组,您可以应用:
foreach ($csv as $i=>$row) {
$csv[$i] = array_combine($keys, $row);
}
// Opening the file for reading...
$fp = fopen('path_to_your_file.csv', 'r');
// Headrow
$head = fgetcsv($fp, 4096, ';', '"');
// Rows
while($column = fgetcsv($fp, 4096, ';', '"'))
{
// This is a great trick, to get an associative row by combining the headrow with the content-rows.
$column = array_combine($head, $column);
echo $column['column1'];
}
I modified first answer to better handle different column separators 我修改了第一个答案以更好地处理不同的列分隔符
if (($handle = fopen("hdbsource/products_stock.csv", "r")) !== FALSE) {
while (($csv[] = fgetcsv($handle, 1000, ',')) !== FALSE) {}
fclose($handle);
}
$keys = array_shift($csv);
foreach ($csv as $i=>$row) {
$csv[$i] = array_combine($keys, $row);
}
I made this quick solution using fgetcsv, works fine and it's easier to read and understand. 我使用fgetcsv制作了这个快速的解决方案,工作正常,更容易阅读和理解。 Then the whole result is saved in the $csv array
然后整个结果保存在$ csv数组中
$csv = array();
$i = 0;
if (($handle = fopen($upload['file'], "r")) !== false) {
$columns = fgetcsv($handle, 1000, ",");
while (($row = fgetcsv($handle, 1000, ",")) !== false) {
$csv[$i] = array_combine($columns, $row);
$i++;
}
fclose($handle);
}
Can't you just do one fgetcsv
call first to get the headers, and then start a loop to get the rest? 你不能只是先做一个
fgetcsv
调用来获取标题,然后开始一个循环来得到其余的吗?
Modified the example found in the manual . 修改了手册中的示例。 It should write out a table with headers and values following.
它应该写出一个包含标题和值的表。
<?php
$row = 1;
if (($handle = fopen('test.csv', 'r')) !== FALSE)
{
echo '<table>';
// Get headers
if (($data = fgetcsv($handle, 1000, ',')) !== FALSE)
{
echo '<tr><th>'.implode('</th><th>', $data).'</th></tr>';
}
// Get the rest
while (($data = fgetcsv($handle, 1000, ',')) !== FALSE)
{
echo '<tr><td>'.implode('</td><td>', $data).'</td></tr>';
}
fclose($handle);
echo '</table>';
}
?>
try using str_getcsv — Parse a CSV string into an array 尝试使用str_getcsv - 将CSV字符串解析为数组
it should solve ur prob... 它应该解决你的问题......
It looks like it might be taking it all as one line. 看起来它可能会把它全部作为一条线。 Perhaps your csv has a different line ending than it should have?
也许你的csv有一个不同的行结束? At least that's what it looks like in your output.
至少那是你输出中的样子。 If you look at row 1, column 5 in your result array, it contains a line ending and column 1 in row 2. And the same in the rest.
如果查看结果数组中的第1行第5列,它将包含第2行中的行结尾和第1列。其余部分则相同。 It reads it all in as one line.
它把它全部读成一行。
Note: If PHP is not properly recognizing the line endings when reading files either on or created by a Macintosh computer, enabling the auto_detect_line_endings run-time configuration option may help resolve the problem.
注意:如果在读取Macintosh计算机上或由Macintosh计算机创建的文件时PHP未正确识别行结尾,则启用auto_detect_line_endings运行时配置选项可能有助于解决问题。 -- fgetscv
- fgetscv
What platform are you on? 你在什么平台上? Either way, check the line endings.
无论哪种方式,检查行结尾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.