-4

Java でこの文字列を解析する最良の方法は何ですか?

Admin State    State          Type             Interface Name
-------------------------------------------------------------------------
Enabled        Connected      Dedicated        Local Area Connection

Enabled        Connected      Dedicated        Local Area Connection 2

各単語の間はスペースであり、タブではなく、他のものではありません。スペースの数が等しくないことがわかります。また、「ローカルエリア接続」などの単語の間もスペースです。

実際には、すべてのネットワーク インターフェイスの名前とそれらの状態が必要です。これは、Windows の「netsh」コマンドの出力です。(他のコマンド ウィッチがこの情報を key:value として取得できることを知っている場合、それは役に立ちます。または、このコマンドをフォーマットするための引数がある可能性がありますか?)

私がこのようなものを手に入れることができれば、それは大いに役立ちます:

インターフェイス名: ローカル エリア接続
タイプ: 専用
状態: 接続
済み管理者状態: 有効

インターフェイス名: ローカル エリア接続 2
タイプ: 専用
状態: 接続
済み 管理状態: 有効

4

6 に答える 6

2
BufferedReader b = new BufferedReader(new StringReader(myString));

String line;
while (!(line = b.readLine()).startsWith("-----")) {/*skip*/};

while ((line = b.readLine()) != null) {
    if (line.trim().equals("")) continue; // skip blank lines
    String[] splat = line.split(" +",4);
    System.out.println("Interface Name : " + splat[3]);
    System.out.println("Type : " + splat[2]);
    System.out.println("State : " + splat[1]);
    System.out.println("Admin State : " + splat[0]);
}
b.close();
于 2013-02-22T14:04:50.757 に答える
2

ネットワーク インターフェイスを取得するには、Java 機能を使用する必要があります。クラスNetworkInterfaceはあなたが探しているものを提供します。

ここで例を見つけることができます: Listing Network Interface Addresses

于 2013-02-22T14:02:21.263 に答える
1

列の幅がわかっている場合は、String.substring(..)各列とtrim()結果を取得するために使用します。

于 2013-02-22T14:01:17.720 に答える
0
String s ="Admin State    State          Type             Interface Name";
String[] str = s.split("  +");
for(String ss: str)
    System.out.println(ss);

上記のコードを試して、文字列を複数のスペースで分割してください。

出力:

Admin State
State
Type
Interface Name
于 2013-02-22T14:07:00.670 に答える
0

位置がわかっている場合は、次のようにすることができます

String state = line.substring(15, 30).trim();

わからない場合は、既知のヘッダー ( などline.indexOf("State")) の最初の行を解析すると、位置がわかります。

// for the header line
int stateBegin = line.indexOf("State");
int typeBegin = line.indexOf("Type");

// for all other lines
String state = line.substring(stateBegin, typeBegin).trim();
于 2013-02-22T14:01:21.620 に答える
0

列区切りがない場合:

1 - 固定サイズのフィールドのようです。つまり、列には常に X 文字が含まれ、次の列は常に X+1 から始まります。あなたの例では、「管理者の状態」は常に 15 文字で、「状態」は常に 16 文字目から始まります。「状態」も15文字 [...]

2 - 固定サイズのフィールドが機能しない場合は、2 つのスペースで解析を試みることができますが、エラーが発生しやすくなります。

于 2013-02-22T14:02:20.347 に答える