我有三个txt文件,我试图合并,一旦解析完毕,我必须将它们全部分类为三个不同的输出。到目前为止,我已经能够解析所有文件并为它们使用了三种不同的foreach语句。对于文件中的每一行,我必须为每个字符串标注不同的属性。我的目标是将它们全部放入一个阵列并对它们进行排序。到目前为止,这是我的代码:
space.txt
last_name first_name middle_initial gender dob fav_color
Kournikova Anna F F 6-3-1975 Red
Hingis Martina M F 4-2-1979 Green
Seles Monica H F 12-2-1973 Black
comma.txt
last_name, first_name, gender, dob, fav_color
Abercrombie, Neil, Male, Tan, 2/13/1943
Bishop, Timothy, Male, Yellow, 4/23/1967
Kelly, Sue, Female, Pink, 7/12/1959
pipe.txt
last_name | first_name | middle_initial | gender | dob | fav_color
Smith | Steve | D | M | Red | 3-3-1985
Bonk | Radek | S | M | Green | 6-3-1975
Bouillon | Francis | G | M | Blue | 6-3-1975
data.php
<?php
$space_txt = './data/input/space.txt';
$comma_txt = './data/input/comma.txt';
$pipe_txt = './data/input/pipe.txt';
$parsed_space_data = file_get_contents($space_txt);
$parsed_comma_data = file_get_contents($comma_txt);
$parsed_pipe_data = file_get_contents($pipe_txt);
$spaces = explode("\r", $parsed_space_data);
$commas = explode("\r", $parsed_comma_data);
$pipes = explode("\r", $parsed_pipe_data);
foreach ($spaces as $space => $data) {
$space_data = explode(' ' , $data);
$info[$space]['last_name'] = $space_data[0];
$info[$space]["first_name"] = $space_data[1];
$info[$space]["middle_initial"] = $space_data[2];
$info[$space]["gender"] = $space_data[3];
$info[$space]["date_of_birth"] = $space_data[4];
$info[$space]["favorite_color"] = $space_data[5];
$s_array = implode(' ' , array($info[$space]['last_name'], $info[$space]["first_name"], $info[$space]["gender"], $info[$space]["date_of_birth"], $info[$space]["favorite_color"]));
$space_old_data = array("F", "-");
$space_new_data = array("Female", "/");
$space_array = str_replace($space_old_data, $space_new_data, $s_array);
echo $space_array . '<br><br>';
}
foreach ($commas as $comma => $data) {
$comma_data = explode(',', $data);
$info[$comma]["last_name"] = $comma_data[0];
$info[$comma]["first_name"] = $comma_data[1];
$info[$comma]["gender"] = $comma_data[2];
$info[$comma]["favorite_color"] = $comma_data[3];
$info[$comma]["date_of_birth"] = $comma_data[4];
$comma_array = implode(' ' , array($info[$comma]['last_name'], $info[$comma]["first_name"], $info[$pipe]["middle_initial"],$info[$comma]["gender"], $info[$comma]["date_of_birth"], $info[$comma]["favorite_color"]));
echo $comma_array . '<br><br>';
}
foreach ($pipes as $pipe => $data) {
$pipe_data = explode(' |', $data);
$info[$pipe]["last_name"] = $pipe_data[0];
$info[$pipe]["first_name"] = $pipe_data[1];
$info[$pipe]["middle_initial"] = $pipe_data[2];
$info[$pipe]["gender"] = $pipe_data[3];
$info[$pipe]["favorite_color"] = $pipe_data[4];
$info[$pipe]["date_of_birth"] = $pipe_data[5];
$p_array = implode(' ' , array($info[$pipe]['last_name'], $info[$pipe]["first_name"], $info[$pipe]["middle_initial"], $info[$pipe]["gender"], $info[$pipe]["favorite_color"], $info[$pipe]["date_of_birth"]));
$pipe_old_data = array("M", "-");
$pipe_new_data = array("Male", "/");
$pipe_array = str_replace($pipe_old_data, $pipe_new_data, $p_array);
echo $pipe_array . '<br><br>';
}
?>
以下输出应为:
输出1
Hingis Martina Female 4/2/1979 Green
Kelly Sue Female 7/12/1959 Pink
Kournikova Anna Female 6/3/1975 Red
Seles Monica Female 12/2/1973 Black
Abercrombie Neil Male 2/13/1943 Tan
Bishop Timothy Male 4/23/1967 Yellow
Bonk Radek Male 6/3/1975 Green
Bouillon Francis Male 6/3/1975 Blue
Smith Steve Male 3/3/1985 Red
输出2
Abercrombie Neil Male 2/13/1943 Tan
Kelly Sue Female 7/12/1959 Pink
Bishop Timothy Male 4/23/1967 Yellow
Seles Monica Female 12/2/1973 Black
Bonk Radek Male 6/3/1975 Green
Bouillon Francis Male 6/3/1975 Blue
Kournikova Anna Female 6/3/1975 Red
Hingis Martina Female 4/2/1979 Green
Smith Steve Male 3/3/1985 Red
输出3
Smith Steve Male 3/3/1985 Red
Seles Monica Female 12/2/1973 Black
Kournikova Anna Female 6/3/1975 Red
Kelly Sue Female 7/12/1959 Pink
Hingis Martina Female 4/2/1979 Green
Bouillon Francis Male 6/3/1975 Blue
Bonk Radek Male 6/3/1975 Green
Bishop Timothy Male 4/23/1967 Yellow
Abercrombie Neil Male 2/13/1943 Tan
在每个foreach语句之外,当我打印一个数组时,它只打印每个文件的最后一行。我可以做些什么来简化代码以实现我的目标?
答案 0 :(得分:0)
您需要创建一个数组的多维数组。而不是
$space_array = str_replace($space_old_data, $space_new_data, $s_array);
使用
$space_array[] = str_replace($space_old_data, $space_new_data, $s_array);
然后在foreach之外使用print_r
转储所有数据
print_r($space_array)
答案 1 :(得分:0)
您可以在案件中尝试fgetcsv
像这样的东西
ini_set('auto_detect_line_endings',TRUE);
$handle = fopen('/path/to/file','r');
while ( ($data = fgetcsv($handle) ) !== FALSE ) {
//process
}
ini_set('auto_detect_line_endings',FALSE);
或者,如果您不想自动检测。您可以将separator指定为fgetcsv的第3个参数
答案 2 :(得分:0)
我把它全部放在一个循环中,但你也可以为它创建一个函数而不是使用多个if
s
//$space_txt = './data/input/space.txt';
//$comma_txt = './data/input/comma.txt';
//$pipe_txt = './data/input/pipe.txt';
//$parsed_space_data = file_get_contents($space_txt);
//$parsed_comma_data = file_get_contents($comma_txt);
//$parsed_pipe_data = file_get_contents($pipe_txt);
$spaceArray = myExpldeLoopFunc("space"," ",$parsed_space_data);
$commaArray = myExpldeLoopFunc("comma",",",$parsed_comma_data);
$pipeArray = myExpldeLoopFunc("pipe","|",$parsed_pipe_data);
$finalArray = array_merge($spaceArray,$commaArray,$pipeArray);
function myExpldeLoopFunc($name, $sep, $data){
$parsedData = explode("\r", $data);
$arr = [];
foreach($parsedData as $data):
$dataArr = explode($sep, $data);
if($name == 'space'):
$arr[] = [
"last_name" => $dataArr[0],
"first_name" => $dataArr[1],
"middle_initial" => $dataArr[2],
"gender" => $dataArr[3],
"date_of_birth" => $dataArr[4],
"favorite_color" => $dataArr[5]
];
elseif($name == 'comma'):
$arr[] = [
"last_name" => $dataArr[0],
"first_name" => $dataArr[1],
"gender" => $dataArr[2],
"favorite_color" => $dataArr[3],
"date_of_birth" => $dataArr[4]
];
else:
$arr[] = [
"last_name" => $dataArr[0],
"first_name" => $dataArr[1],
"middle_initial" => $dataArr[2],
"gender" => $dataArr[3],
"favorite_color" => $dataArr[4],
"date_of_birth" => $dataArr[5]
];
endif;
endforeach;
return $arr;
}