0

小さなチャンクに分割する必要がある長い文字列がありますが、チャンクはオーバーラップする必要があります。出力文字列とオーバーラップの長さは可変でなければなりません。

例:

テキストファイルでこれから始めます:

-----------------------------------------------------

出力は次のように記述されています。

---------------------
---------------------
---------------------
4

3 に答える 3

3

次のような意味だと思います:

def get_overlapped_chunks(textin, chunksize, overlapsize):  
    return [ textin[a:a+chunksize] for a in range(0,len(textin), chunksize-overlapsize)]

説明

[0, step, 2*step,..., len(input)-chunksize]ここでは、リスト内包表記を使用します。これは、出力文字列がwhereで始まるインデックスを取得し、step = chunksize-overlapsizeこれらの位置に長さチャンクサイズのテキストを返します。

使用法

この関数は、次のように使用できます。

textin = ''.join(open(FILENAME, 'r').readlines()) # text as single line

CHUNKSIZE=10
OVERLAPSIZE = 2    

chunks = get_overlapped_chunks(textin, CHUNKSIZE, OVERLAPSIZE)

fout = open(FILEOUT, 'w')
fout.writelines(chunks)
于 2012-07-24T17:42:29.347 に答える
2

stringを指定すると、 slicessを使用してサブシーケンスを取得できます。

>>> s = 'abcdefghijklmnopqrstuvwxyz'
>>> s[0:5]
'abcde'

ここで、スライスは 0 番目の文字から 5 番目の文字まで (ただし含まない) を提供します。このrange(start, end, step)関数は、 から始まり、 で増加する数のリストを返しstartますendstep

>>> range(0, len(s), 6)
[0, 6, 12, 18, 24]

2つを組み合わせると、次のようなものが得られます

>>> for i in range(0, len(s), 6):
...     print s[i:i+8]
... 
abcdefgh
ghijklmn
mnopqrst
stuvwxyz
yz

スライス操作は「寛容」であるため、最後の行に からの 8 文字未満の短い回答が得られs[24:34]ます。

于 2012-07-24T17:49:45.023 に答える
0

ピュアバッシュ:

length=20
overlap=3

while read line ; do
  idx=0
  while [ $idx -lt ${#line} ] ; do
    echo "${line:idx:length}"
    ((idx+=length-overlap))
  done
done < "$infile"
于 2012-07-25T10:35:40.923 に答える