我有两个文件,一个是制表符分隔的,一个是逗号分隔的csv,它们都上传了,我需要将它们组合成一个有序的csv ...这里是我的代码到目前为止
$txt = glob('files/*.txt*');
$csv = glob('files/*.csv*');
$test = array();
if (($handle = fopen($csv[0], "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
$row++;
for ($c=0; $c < $num; $c++) {
$test[$c][] = $data[$c];
}
}
fclose($handle);
}
if (($handle = fopen($txt[0], "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
$num = count($data);
$row++;
for ($c=0; $c < $num; $c++) {
$test[$c][] = $data[$c];
}
}
fclose($handle);
}
测试数组有两个完整的数组但是我遇到了一些问题首先$ test数组是这样的
[0] => Array
(
[0] => Edit
[1] => y
[2] => y
[3] => y
[4] => y
[5] => y
[6] => y
[7] => y
[8] => y
[9] => y
[1] => Array
(
[0] => Event
[1] => Carolina Panthers PSL
[2] => Florida
[3] => Carolina Panthers PSL
[4] => Apple
[5] => Carolina Panthers PSL
[6] => Carolina Panthers PSL
[7] => Carolina Panthers PSL
[8] => Carolina Panthers PSL
[9] => Carolina Panthers PSL
[10] => Carolina Panthers PSL
[2] => Array
(
[0] => Venue
[1] => Bank of America Stadium
[2] => Washington Mutual
[3] => Bank of America Stadium
[4] => Apple Inc
[5] => Bank of America Stadium
[6] => Bank of America Stadium
[7] => Bank of America Stadium
[8] => Bank of America Stadium
[9] => Bank of America Stadium
[10] => Bank of America Stadium
[11] => Bank of America Stadium
[12] => Bank of America Stadium
我如何使用所有内容创建一个新的csv,但我需要按事件名称进行排序,这个测试数组的格式似乎没有了......任何想法我做错了...
答案 0 :(得分:3)
假设列名在文件的第一行,这应该有效:
$txt = glob('files/*.txt*');
$csv = glob('files/*.csv*');
$test = array();
$headers = array();
if (($handle = fopen($csv[0], "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
if (empty($headers)) {
for ($c=0; $c < $num; $c++) {
$headers[$c] = $data[$c];
}
}
else {
$line = array();
for ($c = 0; $c < $num; $c++) {
$line[$headers[$c]] = $data[$c];
}
$test[] = $line;
}
}
}
if (($handle = fopen($csv[0], "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data);
$line = array();
for ($c = 0; $c < $num; $c++) {
$line[$headers[$c]] = $data[$c];
}
$test[] = $line;
}
}
那应该给你一个像
这样的数组[0] => Array
(
[Edit] => y
[Event] => Carolina Panthers PSL
[Venue] => Bank of America Stadium,
...
[1] => Array
(
[Edit] => y
[Event] => Florida
[Venue] => Washington Mutual ,
...
然后,您可以在阵列上使用usort
,使用自定义回调按Event
键对其进行排序。有关示例的负载,请参阅该函数的文档页面,或者尝试:
function my_sort($a, $b) {
return strcmp($a['Event'], $b['Event']);
}
usort($test, 'my_sort');
答案 1 :(得分:2)
以下代码中的某些内容应该对您有用。我相信。
<?php
// Opens files
$file1 = glob("files/*.txt");
$file1 = $file1[0];
$f1 = file("files/$file1");
$file2 = glob("files/*.csv");
$file2 = $file2[0];
$f2 = file("files/$file2");
// Creates counter and storage arrays for each column
$c = 0;
$col1 = array();
$col2 = array();
$col3 = array();
// goes through each of the first files lines
foreach ($f1 as $row => $data)
{
// changes tabs for commas
$data .= str_replace("\t",",",$data);
// splits the string into the 3 columns in different arrays
list($col1[$c],$col2[$c],$col3[$c]) = explode(",",$data);
$c++;
}
foreach ($f2 as $row2 => $data2)
{
if ($row2 != 0)
{
// splits the string into the 3 columns in different arrays
list($col1[$c],$col2[$c],$col3[$c]) = explode(",",$data2);
$c++;
}
}
// Sort by column 2, the event
asort($col2);
// First column is headers
$realOutput = $col1[0].",".$col2[0].",".$col3[0]."\n";
// Add them in sorted order by column 2
foreach ($col2 as $key => $val)
{
if ($key != 0)
$realOutput .= $col1[$key].",".$col2[$key].",".$col3[$key]."\n";
}
echo $realOutput;
?>
答案 2 :(得分:2)
已编辑以考虑不在同一订单中的列,并避免在已排序的数据中出现列标题。这仍然依赖于列标题相同(包括相同的情况)。同样已修复SORTDESC
(应为SORT_DESC
)
$txt = glob('files/*.txt*');
$csv = glob('files/*.csv*');
$rows = $events = array();
// Get data into rows, not columns
if (($handle = fopen($csv[0], "r")) !== FALSE) {
// Get column headers
$headers = fgetcsv($handle, 1000, ",");
// Get rest of rows
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$row = array();
foreach ($data as $k => $v) $row[$headers[$k]] = $v;
$rows[] = $row;
}
fclose($handle);
}
if (($handle = fopen($txt[0], "r")) !== FALSE) {
// Get column headers
$headers = fgetcsv($handle, 1000, "\t");
while (($data = fgetcsv($handle, 1000, "\t")) !== FALSE) {
$row = array();
foreach ($data as $k => $v) $row[$headers[$k]] = $v;
$rows[] = $row;
}
fclose($handle);
}
// Prepare the sort column for array_multisort()
foreach ($rows as $key => $row) {
$events[$key] = $row['Event'];
}
// Sort it
array_multisort($events, SORT_DESC, $rows);
// Open the output file
$outFile = fopen('outfile.csv','w');
// Put the column headers back
fputcsv($outFile, array('Edit','Event','Venue'), ',');
// Write the data
foreach ($rows as $row) {
fputcsv($outFile, $row, ',');
}
// Close the file
fclose($outFile);