[PHP]csvファイルの生成とFTP送信

ちょっとつまづいた所もあったのでメモ。

まずCSVには下記のデータを記述することとする。
今回は連想配列ではなく、値は全て文字列に整形された配列を扱った。

$array = [ 
    [   
        '1',
        'hoge',
        'aaaa' 
    ],  
    [   
        '2',
        'hoge2',
        'bbbb
        bbbb' 
    ],  
    [   
        '3',
        'hoge3',
        'cc' 
    ]   
];

// ヘッダーの定義
$header = ['id','name','content'];

PHPでCSVを生成する方法としてまずはfputcsvで出力を行った。

fputcsvを使う

CSVを生成するには、CSVファイルを開いて内容をループで記述していけば良い。

$fp = fopen(dirname(__FILE__) . '/test.csv', 'w');

// CSVファイルの生成
fputcsv($fp, $header, ',');
foreach ($array as $item) {
    fputcsv($fp, $item, ',');
}
fclose($fp);

これで終わりかと思ったが、これだと id = 2 の値に関しては改行を含む値があるため出力行が異なってしまう。

$ cat test.csv 
id,name,content
1,hoge,aaaa
2,hoge2,"bbbb
        bbbb"
3,hoge3,cc

要件としては改行した値も同一行に含めたかったので、下記のように改行を置換する方法で対応した。

foreachでCSVを生成する

$fp = fopen(dirname(__FILE__) . '/test.csv', 'w');

// CSVファイルの生成
fputcsv($fp, $header, ',');
$data_str = '';
foreach ($array as $item) {
    for ($i = 0; $i < count($item); $i++) {
        $item[$i] = str_replace(['\r\n', PHP_EOL, '\r'], '', $item[$i]);
        if ($i != count($item) - 1) {
            $data_str .= $item[$i] . ',';
        } else {
            // 最後の項目はカンマを付与しない
            $data_str .= $item[$i];
        }
    }
    $data_str .= "\n";
}
file_put_contents(dirname(__FILE__) . '/test.csv', $data_str);
fclose($fp);

そうすると下記のように値が同一行に出力される。

$ cat test.csv 
1,hoge,aaaa
2,hoge2,bbbb        bbbb
3,hoge3,cc

FTP送信

FTP送信は ftp_put を使用する。

function ftpUpload()
{
    // 接続を確立する
    $conn_id = ftp_connect($ftp_server);
    // ユーザー名とパスワードでログインする
    $login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
    if ($login_result) {
        // パッシブモードで送信
        ftp_pasv($conn_id, true);
        // ファイルをアップロードする
        if (ftp_put($conn_id, $remote_filepath, $local_filepath, FTP_ASCII)) {
            $result = true;
        } else {
            $result = false;
        }

        // 接続を閉じる
        ftp_close($conn_id);
    } else {
        ftp_close($conn_id);
    }

    return $result;
}

参考

fputcsv

ftp_put

ftp_pasv

カテゴリーPHP

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

five × two =

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください