Translate

2016年1月27日水曜日

【php】配列をCSVに書き出し&文字コード変換

表題どおり。
配列内の要素を一つ一つshiftjisに変換してから書き込んでいます。
日本語文字コードを一つに統一して欲しいのだけど、血を血で洗う戦争が起きたりするのでしょうか。
    $csv = new SplFileObject( "csv.csv", "w" );
    foreach ($array_for_csv as $raw_array) {
        $encodedarray =array();
        foreach ($raw_array as $rawtext) {
            $encodedarray[] = mb_convert_encoding($rawtext,'SJIS');
        }
        $csv->fputcsv($encodedarray);
    }
    fclose($csv);

2016年1月26日火曜日

【php】【phpexcel】他のシートからデータをコピーする

テンプレートなどを読み込みたいときに。


<?php
    require_once './Classes/PHPExcel.php';
    require_once './Classes/PHPExcel/IOFactory.php';

    $book = new PHPExcel();

    $templateExcel = PHPExcel_IOFactory::load(dirname(__FILE__) .'/tmp/template.xlsx');
    $sheet = $templateExcel->getSheetByName('template')->copy();
    unset($templateExcel);
    $sheet->setTitle("hoge");
/*
$sheetの
編集があれば、ここで




*/
    $book->addSheet($sheet);
    $writer = PHPExcel_IOFactory::createWriter($book, "Excel2007");
    $writer->save(dirname(__FILE__) .'/huga.xlsx');
    $book->disconnectWorksheets();
    unset($book);

2016年1月20日水曜日

【php】エクセルをコピペして配列に収納

csv経由で一括とかではなく、エクセルの内容をDBなどに入れたい場合、
エクセルの内容を入力フォームにペーストすると、
セルごとにtabで区切られたテキストが表示される。
これをそのままフォームへpostしたと仮定して、受け側のプログラム。
条件として、
○コピペする列の数は決まっている
○最後の列に改行記号が入っていない
とします。

$contents = $_POST["contents"];//これがフォームの内容
$celllength = 10;//一行あたりのセルの数を決めておく
$masterarray =[];//目標となる配列。ここに全て入れたい。
$count =0;

$array = explode("\t", $contents);//とりあえず全てtabで区切る

foreach ($array as $key => $value) {
   if($count % ($celllength-1) ==0 &&$count>0)//最後の列は次の行の最初の列とくっついているので、改行記号で分ける。
   {
      $masterarray[]=explode("\n",$value)[0];
      $masterarray[]=explode("\n",$value)[1];
   }
   else {
      $masterarray[]=$value;
   }
   $count++;
}
if(count($masterarray) > $celllength)
{
   array_pop($masterarray);//最後の行の最後の列を二つにしてしまったので、削除しておく
}

if(count($masterarray) % $celllength !=0 )//postされたセルの数が正しいか確認
{
   echo "error:セルの数が不正です。エクセルの選択範囲を見直してください。";
   die;
}

foreach ($masterarray as $key => $value) {
   echo $key.":".$value."\r";//debug
}

後はお好きに。$masterarrayは連想配列にしてあげたほうが使いやすいですね。

2016年1月18日月曜日

【jquery】複雑な形のテーブル要素の取得

不幸にしてこんなテーブルに遭遇したとする

     
   
     
     

テーブル内の要素を順番に取得する方法は

$(function() {
    $("table tr").each(function() {
        $(this).children().each(function () {
           alert( $(this).html());
        });
    });
});

こんなかんじ。では、どんな順番で取得するかというと

123456
789
1011121314
1516171819

このような順番で取得してくれる。
例えば二行目だけ取得しようとすると

   $('table tr:nth-child(2)').children().each(function () {
        alert( $(this).html());
     });
こんなコードになるが、結果は
7,8,9となる。

逆に7,4,8,9と取得したいときが面倒くさそう。

2016年1月13日水曜日

【mysql】最新状況を検索したいの続き

よく考えたら前回の記事では最新状況の一覧は出せたが、検索はできていなかった。

(前回)

FLOW: start -- aaa--bbb--ccc--end

select * from ( select * from log where status = "aaa" OR status = "bbb" OR status = "ccc" order by date desc) as t group by product order by date desc
//all id's recent log

ここからさらに塗装中の個別IDを拾いたいときは、こんな感じ

select * from (select * from ( select * from log order by date desc) as t group by product order by date desc) as t2 where status ="aaa"
//search where recent status is  "aaa"

2016年1月9日土曜日

【mysql】最新状況を検索したい

例えばある製品の製造工程をログにとっているとして、
テーブルは
id product status date
という項目、
開梱→組み立て→塗装→梱包→発送
というフローだとする。
このうち、組み立てから梱包までの作業上にある製品の、最新ステータスを検索したいとき

select * from ( select * from log where status = "組み立て" OR status = "塗装" OR status = "梱包" order by date desc) as t group by product order by date desc

group by で値を拾うときはテーブルの一番上の行を採用するらしいので、
ソートをかけて拾いたい最新のデータを、()内で一番上にもってきている。

2016年1月8日金曜日

【javascript】簡潔な配列の宣言

var array1 = ["contents1","contents2","contents3","contents4","contents5","contents6"];
var array2 ="contents1,contents2,contents3,contents4,contents5,contents6".split(",");

下のほうが書きやすく、要素が多くなるほど文字数を省ける