2

私は2つのファイルを持っています。1つはタブ区切りで、もう1つはコンマ区切りのcsvで、両方がアップロードされ、それらをソートされた1つの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 を作成するにはどうすればよいですか?イベント名で並べ替える必要がありますが、テスト配列のこの形式は正しくないようです..何が間違っているのか考えてみてください...

4

3 に答える 3

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');
于 2011-11-17T17:55:59.037 に答える
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;

?>
于 2011-11-17T17:52:58.117 に答える
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);
于 2011-11-17T18:05:05.607 に答える