2017-01-27 11 views
1

私はサーバーにSOAPリクエストを行い、正常に動作するpythonプログラムを持っています:
私はサーバーから答えを得て、私が行っていたときに、とは、私はそのような文字列で終わる:Python - 特定の数の特殊文字の後に文字列を分割する

name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|...

基本的に、それはで区切られた値を持つ文字列です「|」。私はまた、私が要求しているデータベースの構造を知っているので、6つの列とさまざまな行があることがわかります。私は基本的に、6日ごとに文字列を分割する必要があります "|"次のようなものを得る:

name|value|value_name|default|seq|last_modify| 

record_type|1|Detail|0|0|20150807115904| 

zero_out|0|No|0|0|20150807115911| 

out_ind|1|Partially ZeroOut|0|0|20150807115911|... 

これをPythonでどうやって行うのか教えてもらえますか?ありがとうございました!これについて

+1

s内の各文字をループすることはできません"|"を数え続けてカウントが6で割り切れるときに分割しますか? – Ryan

+0

@ Ryanあなたはそれを行うことができますが、文字を1つずつスキャンするPythonループを書くのではなく、より効率的に区切り文字を見つけることができるCの速度で実行する関数を使う方が速いです。 'str.split'メソッド(あるいはおそらく' str.partition')を使う代わりに、 'str.index'か' str.find'のどちらかを適切な 'start'引数とともに使うことができます。 –

+0

@ Ryan:私はそれについて考えましたが、PM 2Ringが言っていたように、これは時間がかかるでしょう:サーバーからの回答の中には、何百万ものフィールドを持つテーブルが含まれている可能性があります。立ち入り禁止。とにかくありがとうございました! – giga

答えて

2

はここで機能的なスタイルのソリューションです。

s = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|' 

for row in map('|'.join, zip(*[iter(s.split('|'))] * 6)): 
    print(row + '|') 

出力zip(*[iter(seq)] * rowsize)作品は、Splitting a list into even chunksにあるリンクを参照してください方法についての情報は

name|value|value_name|default|seq|last_modify| 
record_type|1|Detail|0|0|20150807115904| 
zero_out|0|No|0|0|20150807115911| 
out_ind|1|Partially ZeroOut|0|0|20150807115911| 

1

方法:

a = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|' 
b = a.split('|') 
c = [b[6*i:6*(i+1)] for i in range(len(b)//6)] # this is a very workable form of data storage 
print('\n'.join('|'.join(i) for i in c)) # produces your desired output 

# prints: 
# name|value|value_name|default|seq|last_modify 
# record_type|1|Detail|0|0|20150807115904 
# zero_out|0|No|0|0|20150807115911 
# out_ind|1|Partially ZeroOut|0|0|20150807115911 
1
data = "name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|" 
splits = data.split('|') 
splits = list(filter(None, splits)) # Filter empty strings 
row_len = 6 
rows = ['|'.join(splits[i:i + row_len]) + '|' for i in range(0, len(splits), row_len)] 
print(rows) 
>>> ['name|value|value_name|default|seq|last_modify|', 'record_type|1|Detail|0|0|20150807115904|', 'zero_out|0|No|0|0|20150807115911|', 'out_ind|1|Partially ZeroOut|0|0|20150807115911|'] 
0

本当に多くの方法があります。でもループで:

a = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904' \ 
    '|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|' 

new_a = [] 
ind_start, ind_end = 0, 0 
for i in range(a.count('|')// 6): 
    for i in range(6): 
     ind_end = a.index('|', ind_end+1) 
    print(a[ind_start:ind_end + 1]) 
    new_a.append(a[ind_start:ind_end+1]) 
    ind_start = ind_end+1 

印刷は結果だけを見てすることです、あなたはそれを削除します。ここでは

name|value|value_name|default|seq|last_modify| 
record_type|1|Detail|0|0|20150807115904| 
zero_out|0|No|0|0|20150807115911| 
out_ind|1|Partially ZeroOut|0|0|20150807115911| 
+0

'.index'を使った例を書こうとしてくれてありがとう。しかし、あなたは 'ValueError:substring not found'の可能性を扱う必要があります。部分文字列が見つからなければ-1を返す '.find'を使うほうが簡単かもしれません。 –

+0

あなたは正しいです。 .findはより良く、同じ出力を持ちます – gms

1

は、柔軟な発電方式です:

def splitOnNth(s,d,n, keep = False): 
    i = s.find(d) 
    j = 1 
    while True: 
     while i > 0 and j%n != 0: 
      i = s.find(d,i+1) 
      j += 1 
     if i < 0: 
      yield s 
      return #end generator 
     else: 
      yield s[:i+1] if keep else s[:i] 
      s = s[i+1:] 
      i = s.find(d) 
      j = 1 

#test runs, showing `keep` in action: 

test = 'name|value|value_name|default|seq|last_modify|record_type|1|Detail|0|0|20150807115904|zero_out|0|No|0|0|20150807115911|out_ind|1|Partially ZeroOut|0|0|20150807115911|' 
for s in splitOnNth(test,'|',6,True): print(s) 
print('') 
for s in splitOnNth(test,'|',6): print(s) 

出力:

name|value|value_name|default|seq|last_modify| 
record_type|1|Detail|0|0|20150807115904| 
zero_out|0|No|0|0|20150807115911| 
out_ind|1|Partially ZeroOut|0|0|20150807115911| 

name|value|value_name|default|seq|last_modify 
record_type|1|Detail|0|0|20150807115904 
zero_out|0|No|0|0|20150807115911 
out_ind|1|Partially ZeroOut|0|0|20150807115911 
関連する問題