0

私は、バックエンドからいくつかの接続情報を取得し、それを変数として設定する API に取り組んでいます。必要なときに必要なものを取得するために、このデータを解析する方法についていくつか提案が必要です。以下は、私の変数にある出力のサンプルです。

(ArrayOfString){
   string[] = 
      "Starting Up
- AuthCode OK
- Found 4123 Devices
Done
OK",
      "007.blahname.com AB Publishing   1.1.1.1 CentOS Linux 5.0            
",
      "027503-blah  test blah   1.1.1.2 NetScaler OS    Network Gathering   1.1.1.1 22
",
      "028072-;alskdjf; Alpha Group 192.168.19.100  CentOS Linux 5  SSH 2.2.2.2 2022
",
      "028072-4alksgjasdfserver Alpha Group 192.168.19.101  CentOS Linux 5  SSH 2.3.4.5 2022
",

簡単に見えるかどうかはわかりませんが、すべてタブで区切られています。最終的に必要なのは、デバイス名 (列 1) を検索し、関連する IP、ポート、および接続方法 (028072 の例の列 7、8、および 6) を読み取ることができるように列として設定することです。
どこから始めるべきかについてのヘルプ/アイデアは役に立ちます。

4

3 に答える 3

0

.split('\t')具体的にはタブまたは空白で分割できる.split()と思います。

于 2013-04-10T00:19:10.190 に答える
0

あなたが私たちに示したものは、C# ソース コードのように見えます。それが実際に得られているものである場合は、最初にそのソース コードから文字列を解析する必要があります。次に、それらの文字列から列を解析できます。

だから、最初に:

r = re.compile(r'"(.*?)"', re.MULTILINE | re.DOTALL)
lines = r.findall(data)

次に、最初の文字列 (多数の改行を含む文字列) は、スキップしたいヘッダー情報のようです。また、各行には改行があります。それでは、これらの両方を修正しましょう: (正規表現でその改行を取り除くこともできましたが、ここで行うのと同じくらい簡単です。)

lines = [line.rstrip('\n') for line in lines[1:]]

これで、各文字列をタブで列に分割できますよね?

values = [line.split('\t') for line in lines]

それでおしまい。

別の方法として、それを実行StringIO(''.join(lines))して … に渡すこともできましcsv.reader(sio, delimiter='\t')た。解析が単なる よりも複雑である場合はsplit、おそらくそうするでしょう。しかし、この場合、節約するよりも複雑さが増すと思います。


しかし、問題があります。正しくコピーして貼り付けた場合、これらの文字列にはタブがなく、スペースが含まれています。また、列自体には内部スペースがあり、引用符やエスケープがないため、それらを分割する明確な方法はありません。タブストップを推測してタブを再構築しようとするヒューリスティックコードを書くことはできます.2つ以上のスペースの連続はタブである必要があるなど.

于 2013-04-10T01:10:15.953 に答える