我有一个CSV文件,我正在将其解析为一个关联数组,我需要将其保存在数据库中。问题是我的某些 CSV 列包含其他 CSV 值,我需要将这些值单独插入到数据库中。例子更好说,所以这里是:
ID, Col1, Col2
1, "Example 1.1.1,Example 1.1.2", Example 1.2
2, Example 2.1, "Example 2.2.1, Example 2.2.2"
如您所见,对于第 1 行,第一列中有 2 个值,对于第 2 行,第二列中有 2 个值。
我以某种方式需要将它们扩展到 4 个单独的数组项目,如下所示:
array(
[0] => array( "ID" => 1, "Col1" => "Example 1.1.1", "Col2" => "Example 1.2" ),
[1] => array( "ID" => 1, "Col1" => "Example 1.1.2", "Col2" => "Example 1.2" ),
[2] => array( "ID" => 2, "Col1" => "Example 2.1", "Col2" => "Example 2.2.1" )
[3] => array( "ID" => 2, "Col1" => "Example 2.1", "Col2" => "Example 2.2.2" )
)
PHP 中是否有一个函数可以做到这一点,或者我必须遍历整个事情?
方法:
- 自行读取 CSV 文件的每一行
- 保存 CSV 文件第一行的标头数组
- 对于其他行,请检查双引号内是否有文本。
- 将此文本保存在数组中,并从原始行字符串中删除此文本。
- 从原始行中提取数据并填充数组,如果没有重复项,则将数组附加到"主数组"。
- 这是你的问题:如果有重复项,通过循环遍历双引号中找到的结果数组并单独添加每个结果来处理它们。
此代码应该可以很好地处理您提供的数据,但可能不适用于以下情况:
ID, Col1, Col2
1, "Example 1.1.1,Example 1.1.2", "Example 1.2"
2, Example 2.1, "Example 2.2.1, Example 2.2.2"
一行中超过 CSV 字符串可能会破坏它。我没有太多时间来测试所有的可能性。
代码如下:
$file = @fopen("file.csv", "r");
$major_arr = array();
$headers_array = array();
$iterator = 0;
$total_cols = 0;
if(!empty($file)){
while(! feof($file)){
$major_line_arr = array();
$line_str = fgetcsv($file);
if($iterator == 0){
// First Line
// Read headers
$headers_array = explode(",", $line_str);
// Trim the whitespace in the array
$headers_array = array_map('trim', $headers_array);
$total_cols = sizeof($headers_array);
} else {
// Search for text within double quotes
$text_btw_double_quotes_arr = array();
if(preg_match('/"([^"]+)"/', $line_str, $m)){
array_push($text_btw_double_quotes_arr, $m[1]);
}
// Remove this text from the original line
$new_line_str = $line_str;
if(!empty($text_btw_double_quotes_arr)){
for($i=0; $i<sizeof($text_btw_double_quotes_arr); $i++){
$new_line_str = str_replace($text_btw_double_quotes_arr[$i], "", $new_line_str);
$major_line_arr = array();
$double_quoted_term = $text_btw_double_quotes_arr[$i];
$major_line_arr_tmp = array();
for($j=0; $j<$total_cols; $j++){
array_push($major_line_arr_tmp, $csv_columns_arr[$j]);
}
// Build the Major Line array
if(!empty($headers_array)){
for($j=0; $j<sizeof($headers_array); $j++){
$header_title = $headers_array[$j];
$value = $major_line_arr_tmp[$j];
if($value == ''){
$value = $double_quoted_term;
}
$new_arr = array($header_title => $value);
array_push($major_line_arr, $new_arr);
}
}
// Add the Major Line to the Major array
array_push($major_arr, $major_line_arr);
}
} else {
$major_line_arr_tmp = array();
for($i=0; $i<$total_cols; $i++){
array_push($major_line_arr_tmp, $csv_columns_arr[$i]);
}
// Build the Major Line array
if(!empty($headers_array)){
for($i=0; $i<sizeof($headers_array); $i++){
$header_title = $headers_array[$i];
$value = $major_line_arr_tmp[$i];
$new_arr = array($header_title => $value);
array_push($major_line_arr, $new_arr);
}
}
// Add the Major Line to the Major array
array_push($major_arr, $major_line_arr);
}
}
$iterator++;
}
fclose($file);
}