2014-10-23 2 views
-3

저는 더 빠른 처리를 위해 PowerShell을 사용하여 더 큰 텍스트 또는 CSV 파일을 작은 파일로 분할합니다. 그러나, 나는 평범한 체재 인 오는 약간 파일이있다. 기본적으로 파일을 텍스트 파일로 인쇄합니다. 각 레코드는 1로 시작하는 단일 행으로 시작하며 그 밖의 행에는 없습니다.줄의 위치 1에서 1 번 발생 수를 기반으로 파일을 분할합니다.

내가 할 수 있어야하는 것은 문장의 수에 따라 파일을 분할하는 것입니다. 그래서, 기본적으로 3000 문장의 청크로 파일을 분할하고 싶다면 위치 1에 3001이 1 번 발생하고 그 전에 모든 내용을 새 파일에 복사 할 때까지 내려갈 것입니다. Windows, Linux 또는 OS X에서이 작업을 실행할 수 있으므로 분할을 위해 열려있는 항목이 거의 없습니다.

모든 아이디어는 크게 감사하겠습니다.

+0

이런 질문은 쉽게 닫을 수 있습니다. 이를 위해 다양한 옵션을 이용할 수 있습니다. 그러나 코딩/연구 노력을 보여줄 필요가 있습니다. SO는 코드 작성 서비스가 아닙니다. 당신이 뭔가를 가지고 있다면 당신은 당신의 대답을 업데이트하려고 노력했고 우리는 더 기꺼이 도와 줄 것입니다. 이와 같은 질문에 답하는 것도 바람직하지 않습니다. – Matt

답변

0

아마도 '1'과 새 줄이 있다는 사실을 인식 해보십시오.

with open(input_file, 'r') as f: 
    my_string = f.read() 

my_list = my_string.split('\n1\n') 

는 다음과 같은 형식을 가지고 가정 목록에 각 레코드를 구분 :

1 
.... 
.... 
1 
.... 
.... 
.... 

할 수 있습니다 후 출력 별도의 파일에 목록의 각 요소입니다.

for x in range(len(my_list)): 
    print >> str(x)+'.txt', my_list[x] 
메모리에 파일을로드 방지하기 위해
0

, 새 파일에 각 3000 개 기록을 작성하는 itertool's grouper recipe를 사용하여 다음 점진적으로 기록을 생성하는 함수를 정의하고 수 :

#!/usr/bin/env python3 
from itertools import zip_longest 

with open('input.txt') as input_file: 
    files = zip_longest(*[generate_records(input_file)]*3000, filevalue=()) 
    for n, records in enumerate(files): 
     open('output{n}.txt'.format(n=n), 'w') as output_file: 
      output_file.writelines(''.join(lines) 
            for r in records for lines in r) 

generate_records()가 하나 개의 레코드를 산출 레코드가 입력 파일의 라인의 반복자는 또한 한 번에 :

from itertools import chain 

def generate_records(input_file, start='1\n', eof=[]): 
    def record(yield_start=True): 
     if yield_start: 
      yield start 
     for line in input_file: 
      if line == start: # start new record 
       break 
      yield line 
     else: # EOF 
      eof.append(True) 
    # the first record may include lines before the first 1\n 
    yield chain(record(yield_start=False), 
       record()) 
    while not eof: 
     yield record() 

generate_records()는이다 발전기는 itertools.groupby()과 같습니다.

성능상의 이유로 한 번에 여러 줄의 청크를 읽고 쓸 수 있습니다.

관련 문제