まいど!福地です。
今回もかゆいところに手が届く!そんな記事を書いていきたいと思います(^^♪
ぜひとも今後の開発に役立てていただければと思います!
CSVファイルのソート(並び替え)ができない!?
「出力したCSVファイルソートかけといて!」
全てはこの一言から始まりました・・・。
僕は普段Bizrobo!を使って現場で開発をしています。
僕「わかりましたー!」
いざとりかかろうとしてみると・・・あれ?ソートらしいステップがない?
ネットで検索かけてみるもでてこない。非常にまずい(;´Д`)
できないことはないけど、ステップ組んでなんやしてって、正直効率が悪い・・・困った。
どうにかできないかとアクション一覧を血眼になって探していくと・・・
「コマンドライン実行」ステップ発見!
「これや!」と思い、そこからはヒョイヒョイっと作成できました(^^♪
ということで、コマンドラインのコードの解説をしていきたいと思います!
PowerShell で解決!
コマンドライン使えるなら、コードさえ書けば1つのステップで済む!
そう思い書いたのが以下のコード(日本語の箇所は後に説明しますがBizrobo!で作成する変数です)↓
「 >>powershell -c “$a=gc ‘<< + ディレクトリ指定 + 元ファイル名+ >>’; $($a|select -f 1;$a|select -skip 1|sort {($_ -split ‘,’)[0]})|sc ‘<< + ディレクトリ指定 + 出力ファイル名 + >> ‘”<< 」
それぞれ区切って解説しますね!
①→ ”内に記述されたパスに指定された場所にあるファイルに格納されているテキストなどの項目の内容を取得し、aに代入する(aは任意の文字)
②→ 読込元の1行目をヘッダとして扱うかをセット(0:扱わない、1:ヘッダーとして扱う。)
③→ 読込元の何行目からソートをかけ、出力するか(0:1行目以降、1:2行目以降。②が「0」かつ③が「1」の場合、1行目をヘッダーとして扱わず、出力も2行目からのデータを出力する)
④→カンマ区切り(‘,’)で分割して、n列目(左端を0として数えるので「1列目」は記述としては[0]となる)を並び替えのキーとして、数値型として並び替える
⑤→ ”内に記述されたパスで指定された場所に、$()|で指定した内容を、ファイルに書き込む・置き換える
上記をDesign Studioで実際に使ってみましょう(^^)/
「 コマンドライン実行 」の設定
下記のCSVファイルをソートしていきたいと思います(ここではA列を基準とする)↓
まずは新しくステップを挿入し、アクションから「コマンドライン実行」を選択します。
以下の3つの変数を作成します↓
・「元ファイル名」・・・「Short Text」で作成。ソートをかけたいファイル(拡張子まで入れる)をデフォルトで入れる(ここでは「test.csv」)
・「ディレクトリ指定」・・・ 「Short Text」で作成。 ソートをかけたいファイルが保存されているところまでのパスをデフォルトで入れる( ここでは「C:\Users\ユーザー名\Desktop\ファイルが保存されているところ\」 )
・「出力ファイル名」 ・・・「Short Text」で作成。ソート後の結果のファイル名を入れる(ここでは「test_result.csv」)
変数が作成できれば「コマンドライン実行」の設定を行います。
コマンドラインで エクスプレッション を選択し「編集」→先ほど記載したコードを張り付ける
出力値に設定したディレクトリが表記されているか確認してください。
問題なく表記できていれば実行してみましょう!すると・・・
できました!!A列が順番通りになりました!
たった1つのステップでできちゃうんで、便利ですね( *´艸`)
最後に
皆さんどうでしたか?今回はBizrobo!の操作というよりはコマンドラインのコードの解説よりになってしまいました💦
CSVをソートなんてそうそう無いかもしれませんが、もし必要な時はぜひこちらも参考にしてみてくださいね(^^)
また、「そんなことせんでももっと簡単にできるよー!」って方いらっしゃいましたらぜひ教えてください( ;∀;)
Bizrobo!の可能性を広げるためにこれからも研究し、開発の役に立てるよう僕も発信していきますので、宜しくお願いしますm(_ _)m
コメント
CSVファイルのソート方法、大変参考になりました。
ご存知の範囲で構いませんので、ご教示ください。
2つのキー(列)のソートが下記で実現できているのですが(対象キーをカンマで追加)、
「 >>powershell -c “$a=gc ‘<>’; $($a|select -f 1;$a|select -skip 1|sort {($_ -split ‘,’)[0]},{($_ -split ‘,’)[1]})|sc ‘<> ‘”<< 」
読込元のヘッダを除いた部分をソートし、出力時は一行目にヘッダを挿入して、以降にソート結果を出力したく、当初はご説明を参考に下記を設定しました。
select -f 0 ←0:読込元のヘッダを含めないで選択(ソートの対象範囲と認識)
select -skip 0 ←0:読込元のヘッダを含めて出力
ところが、出力ファイルを確認するとソート自体はできていますが、ヘッダが最後の行に配置されてしまいます。
select -f 1 ←1:読込元のヘッダを含めて選択
select -skip 1 ←1:読込元のヘッダを含めないで出力
とすると、期待の結果が得られております。
-fと-skipの私の認識が間違っておりますでしょうか。
(-f、-skipの説明サイトを探しているのですが、見つからない次第です。)
コメットさん
貴重なコメントありがとうございます!
返答が遅くなり申し訳ございません!
>select -f 0 ←0:読込元のヘッダを含めないで選択(ソートの対象範囲と認識)
>select -skip 0 ←0:読込元のヘッダを含めて出力
→「-f」で対象データの1行目をヘッダーに指定するかしないかの選択(「1」ですとヘッダーとして扱う)
「-skip」で何行目以降をソートするかの指定(「0」の場合1行目以降をソート。「1」の場合、2行目以降をソート。)
となります!
私の記述が間違っており大変失礼いたしました
そして気付かせていただき本当にありがとうございます!
より有益な情報を提供できるよう気を引き締めてまいります
今後ともどうぞよろしくお願いいたします!
ご回答ありがとうございます!
ナレッジベースでは、csvのソートは、DA、または、データベースで実現する方法が展開されていましたが、ソートのみで、それらを実装するのは大変だなぁと感じていました。
すーさんの方法は、1ステップで実現可能な方法で、目からウロコでした。
すーさんのようにナレッジベース以外の方法を自分で考え出せるようなスキルを身に着けたいです!
コメットさん
こちらこそ、貴重な気付きをありがとうございます!
また、本当にうれしいお言葉ありがとうございます!
私自身今でも周りに助けられながら開発しており、「解決できた!」「これは便利!」といった情報を少しでも発信してみなさんの開発のお役に立てればと思ってますので、これからもよろしくお願いいたします!
私もまだまだ未熟ですので、一緒にスキルアップしていきましょう!