以前はC言語でコーディングしていて、scanf
関数が非常に便利であることがわかりました。残念ながら、C#には同等のものはありません。
半構造化テキストファイルの解析に使用しています。
scanf
の実装の興味深い例 here が見つかりました。残念ながら、古くて不完全に見えます。
誰かがscanf
C#実装を知っていますか?または、少なくとも逆に機能するものstring.Format
?
正規表現が機能しない場合は、.NETの代わりにsscanf()
を投稿しました。コードは http://www.blackbeltcoder.com/Articles/strings/a-sscanf-replacement-for-net で表示およびダウンロードできます。
ファイルは「半構造化」されているため、ReadLine()メソッドとTryParse()メソッドの組み合わせ、またはRegexクラスを使用してデータを解析できませんか?
Cのsscanfまたは誰かが書き直した部分(違反なし)を使用するよりも良い解決策を見つけました
http://msdn.Microsoft.com/en-us/library/63ew9az0.aspx この記事をご覧ください。名前付きグループを作成して、パターン化された文字列から必要なデータを抽出する方法について説明しています。記事の小さなエラーと以下のより良いバージョンに注意してください。 (コロンはグループの一部ではありませんでした)
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main()
{
string url = "http://www.contoso.com:8080/letters/readme.html";
Regex r = new Regex(@"^(?<proto>\w+)://[^/]+?(?<port>:\d+)?/",RegexOptions.None, TimeSpan.FromMilliseconds(150));
Match m = r.Match(url);
if (m.Success)
Console.WriteLine(r.Match(url).Result("${proto}:${port}"));
}
}
// The example displays the following output:
// http::8080
ScanfはCランタイムライブラリから直接使用できますが、異なるパラメーター数で実行する必要がある場合、これは難しい場合があります。タスクの正規表現を使用するか、ここでそのタスクを説明することをお勧めします。別の方法があるかもしれません。
Msvcrt.dllをインポートしてみてください
using System.Runtime.InteropServices;
namespace Sample
{
class Program
{
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int printf(string format, __arglist);
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int scanf(string format, __arglist);
static void Main()
{
int a, b;
scanf("%d%d", __arglist(out a, out b));
printf("The sum of %d and %d is %d.\n", __arglist(a, b, a + b));
}
}
}
これは.NET Frameworkでうまく機能します。しかし、Monoでは、エラーメッセージが表示されます。
Unhandled Exception:
System.InvalidProgramException: Invalid IL code in Sample.Program:Main (): IL_0009: call 0x0a000001
[ERROR] FATAL UNHANDLED EXCEPTION: System.InvalidProgramException: Invalid IL code in Sample.Program:Main (): IL_0009: call 0x0a000001
Monoの互換性が必要な場合は、arglist
の使用を避ける必要があります
using System.Runtime.InteropServices;
namespace Sample
{
class Program
{
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int printf(string format, int a, int b, int c);
[DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int scanf(string format, out int a, out int b);
static void Main()
{
int a, b;
scanf("%d%d", out a, out b);
printf("The sum of %d and %d is %d.\n", a, b, a + b);
}
}
}
引数の数は固定されています。
2018-5-24を編集
arglist
も.NET Coreでは機能しません。 Cのvararg関数の呼び出しは推奨されないようです。代わりに、String.Format
などの.NET文字列APIを使用する必要があります。
Scanfのような関数がc#から欠落しているのには十分な理由があります。エラーが発生しやすく、柔軟性がありません。 Regexを使用すると、はるかに柔軟で強力になります。
別の利点は、コードのさまざまな部分で同じものを解析する必要がある場合に、コード全体で再利用しやすくなることです。
C#ライブラリ関数の解析または変換が必要だと思います。
// here's an example of getting the hex value from a command line
// program.exe 0x00080000
static void Main(string[] args)
{
int value = Convert.ToInt32(args[1].Substring(2), 16);
Console.Out.WriteLine("Value is: " + value.ToString());
}
System.IO.FileStreamとSystem.IO.StreamReaderを使用して、そこから解析できます。