- 投稿日:2020-08-06T21:00:49+09:00
""が含まれたCSVをパースする
プログラムでちょっとした、ほんの数行の.csvをパースする必要があったので、
横着してstring[] infoOneArr = line.Split(",");とやったのですが・・・
山田太郎,"ABC Inc,Japan",2,研究,
ありましたよ"ABC Inc,Japan"が。ほんの数行の中に。
""で囲ってあって中にカンマが入っているやつ。
ガッツリと.csvを扱うのならパーサー用意するとか考えるのですが、
ちょっとした.csvなだけになんとなく躊躇してしまいます。曰く「何とかインチキできんのか?」
答え:こんな感じでどうでしょう?
using System.Text.RegularExpressions; : Regex reg = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); string[] infoOneArr = reg.Split(line); // ""で囲まれたものは分割しない for (int n = 0; n < infoOneArr.Length; ++n) infoOneArr[n] = infoOneArr[n].Trim('"'); // 先頭と最後尾の '"' を削除
- 投稿日:2020-08-06T21:00:49+09:00
""(ダブルクォーテーションで囲まれた含まれたCSVをパースする
プログラムでちょっとした、ほんの数行の.csvをパースする必要があったので、
横着してstring[] infoOneArr = line.Split(",");とやったのですが・・・
山田太郎,"ABC Inc,Japan",2,研究,
ありましたよ"ABC Inc,Japan"が。ほんの数行の中に。
""で囲ってあって中にカンマが入っているやつ。
ガッツリと.csvを扱うのならパーサー用意するとか考えるのですが、
ちょっとした.csvなだけになんとなく躊躇してしまいます。曰く「何とかインチキできんのか?」
答え:こんな感じでどうでしょう?
using System.Text.RegularExpressions; : Regex reg = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); string[] infoOneArr = reg.Split(line); // ""で囲まれたものは分割しない for (int n = 0; n < infoOneArr.Length; ++n) infoOneArr[n] = infoOneArr[n].Trim('"'); // 先頭と最後尾の '"' を削除
- 投稿日:2020-08-06T21:00:49+09:00
""(ダブルクォーテーション)で囲まれた含まれたCSVをパースする
プログラムでちょっとした、ほんの数行の.csvをパースする必要があったので、
横着してstring[] infoOneArr = line.Split(",");とやったのですが・・・
山田太郎,"ABC Inc,Japan",2,研究,
ありましたよ"ABC Inc,Japan"が。ほんの数行の中に。
""で囲ってあって中にカンマが入っているやつ。
ガッツリと.csvを扱うのならパーサー用意するとか考えるのですが、
ちょっとした.csvなだけになんとなく躊躇してしまいます。曰く「何とかインチキできんのか?」
答え:こんな感じでどうでしょう?
using System.Text.RegularExpressions; : Regex reg = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); string[] infoOneArr = reg.Split(line); // ""で囲まれたものは分割しない for (int n = 0; n < infoOneArr.Length; ++n) infoOneArr[n] = infoOneArr[n].Trim('"'); // 先頭と最後尾の '"' を削除
- 投稿日:2020-08-06T21:00:49+09:00
C#で ""(ダブルクォーテーション)で囲まれた含まれたCSVをパースする
プログラムでちょっとした、ほんの数行の.csvをパースする必要があったので、
横着してstring[] infoOneArr = line.Split(",");とやったのですが・・・
山田太郎,"ABC Inc,Japan",2,研究,
ありましたよ"ABC Inc,Japan"が。ほんの数行の中に。
""で囲ってあって中にカンマが入っているやつ。
ガッツリと.csvを扱うのならパーサー用意するとか考えるのですが、
ちょっとした.csvなだけになんとなく躊躇してしまいます。曰く「何とかインチキできんのか?」
答え:こんな感じでどうでしょう?
using System.Text.RegularExpressions; : Regex reg = new Regex(",(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$)"); string[] infoOneArr = reg.Split(line); // ""で囲まれたものは分割しない for (int n = 0; n < infoOneArr.Length; ++n) infoOneArr[n] = infoOneArr[n].Trim('"'); // 先頭と最後尾の '"' を削除
- 投稿日:2020-08-06T18:39:03+09:00
【OpenRPA】SSH接続するカスタムアクティビティを作ってみた
OpenRPAでSSH接続をしてみたかったのですが、現時点のバージョンにSSHのアクティビティがなかったので、作ってみました。
どうやって作る?
OpenRPAのwikiを見ると
The robot uses Microsoft Workflow Foundation ( .NET version 4.6.2 ). A lot of different products uses this platform ( even other RPA products, for instance UIPath), and in many cases activities created for one platform will also work here. Say someone created an activity that reads the content of a PDF file and inserted that into a string, that activity would most likely also work inside OpenRPA.
ロボットはMicrosoft Workflow Foundation(.NETバージョン4.6.2)を使用します。多くの異なる製品がこのプラットフォームを使用しており(UIPathなどの他のRPA製品でさえ)、多くの場合、1つのプラットフォーム用に作成されたアクティビティもここで機能します。誰かがPDFファイルのコンテンツを読み取り、それを文字列に挿入するアクティビティを作成したとします。そのアクティビティはおそらくOpenRPA内でも機能します。
要は、「Workflow Foundationベースで作られたものならOpenRPAでもたぶん使えるよ!」とのこと。
逆に言えば、UiPathのカスタムアクティビティの作成方法がわかれば、OpenRPAのカスタムアクティビティも作れるはず!参考にした記事
【UiPath】カスタムアクティビティの作成(事前準備と実践初級)
UiPath Studioで使用するカスタムアクティビティの作成方法
UiPath Studioで使用するカスタムアクティビティの作成方法 つづき(GUI構築)UiPathのカスタムアクティビティの作成方法として、これらの記事を参考にしました。
OpenRPAのカスタムアクティビティを作成する場合も、ほとんど上記と同じ内容で作成できます。
ただし、現在のOpenRPAではNuGetに対応していないため、NuGet関連の手順については無視します。というわけでできたもの
https://github.com/pmt-iwata/RunCommandActivity
インストール方法
Visual Studioでビルドすると、Releaseの下に
- OpenRPA.PMTech.SSH.dll
- Renci.SshNet.dll
ができるので、OpenRPAのフォルダ(C:\Program Files\OpenRPA)にコピーしてください。
ちょっとだけ解説
アクティビティ自体の作り方は、上記の参考記事の通りに作っただけなので、解説は省きます。
SSH接続
SSH接続については、SSH.NETというライブラリを使っています。
Visual StudioのNuGetパッケージマネージャからダウンロードして使っています。SSHパスワード問題
こんな感じで接続情報作ってるんですが、パスワードがプレーンテキストなんですよね。
RunCommandActivity.cspublic InArgument<string> Password { get; set; } ConnectionInfo con = new ConnectionInfo(host, port, user, ProxyTypes.None, null, 0, null, null, new AuthenticationMethod[] { new PasswordAuthenticationMethod(user, password) });
SecureString
使ってあげればプレーンテキストは回避できると思うのですが、テストがどうしてもエラーになってしまって解決できませんでした。
PasswordAuthenticationMethod
を使っているのでユーザー/パスワードの認証しかできませんが、PrivateKeyAuthenticationMethod
を使えば秘密鍵方式の認証もできそうなので、プレーンテキスト問題と合わせて今後の課題かなー。おわりに
一応動作確認はしていますが、ちゃんとテストはしていません。
(SSH.NET呼んでるだけだから大丈夫だとおもうけど)今回作ったのは単発のアクティビティなんですが、ほんとはスコープみたいな感じでやりたかったんですよね。
(最初に接続先だけ定義して、複数コマンド連続実行みたいな)
このあたりもうちょっと調べて、機能追加してみようと思います。
- 投稿日:2020-08-06T09:17:07+09:00
C# 9.0 で Hello World が簡単になる
11 月にリリース予定の C# 9.0 でトップレベルステートメントが導入され、namespace や class を省略して文を直接トップレベルに書けるようになります。
C# 9.0 の新機能 - C# によるプログラミング入門 | ++C++; // 未確認飛行 C
これによって次のように Hello World がとてもシンプルに書けるようになります。
従来
using System; namespace ConsoleApp1 { class Program { static void Main() { Console.WriteLine("Hello World!"); } } }C# 9.0
System.Console.WriteLine("Hello World!");C# 9.0 を今すぐ使いたい場合には Visual Studio Preview が必要です。
Visual Studio Previewそしてプロジェクトファイルの
TargetFramework
を次のようにnet5
に書き換えてください。以上で使えるようになります。<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>net5</TargetFramework> </PropertyGroup> </Project>C# 8.0 からの switch 式とパターンマッチングを使うと、FizzBuzz も次のようにシンプルに書くことができます。
using static System.Console; for (int i = 1; i < 100; i++) WriteLine((i % 3, i % 5) switch { (0, 0) => "FizzBuzz", (0, _) => "Fizz", (_, 0) => "Buzz", _ => i.ToString() });ただこのトップレベルステートメント、
Main
メソッドを自動生成してるだけだから、他のクラスには使えないんですよね。Main
メソッドに何かを長々と書くことなんかふつうないし、ここで定義された関数はローカル関数でテストの対象にならないので、ちょっとしたスクリプトを書く時以外には役に立たないのがなんとも。次のように、名前空間とクラスをネストせず書けるようにするだけの方が使いやすかったと思うんですよね。
using System; namespace ConsoleApp1; public class Program; static void Main() { Console.WriteLine("Hello World!"); }