2017-02-13 3 views
0

다음 표는 task-spooler의 출력입니다.팬더 ('task-spooler')로 복잡한 테이블 읽기

사람이 쉽게 파싱 할 수 있지만 팬더 DF로 읽는 데 문제가 있습니다.

아이디어가 있으십니까?

ID State  Output    E-Level Times(r/u/s) Command [run=1/2] 
6 running /tmp/ts-out.FzVneG       [l1]python infloop.py 
0 finished /tmp/ts-out.ixWHm2 0  0.00/0.00/0.00 bash -c echo 1 
1 finished /tmp/ts-out.ZzwS11 0  0.00/0.00/0.00 bash -c echo 1 
2 finished /tmp/ts-out.GJlyge 2  0.00/0.00/0.00 bash -c 
4 finished /tmp/ts-out.lIVMYH 2  0.00/0.00/0.00 bash -c -h 
5 finished /tmp/ts-out.8EKHy1 -1  141.23/0.00/0.00 python infloop.py 
3 finished /tmp/ts-out.lBr4Wy -1  2545.36/0.00/0.02 bash -c python infloop.py 
7 finished /tmp/ts-out.kxCczi 2  0.01/0.00/0.00 bash -c 
8 finished /tmp/ts-out.3VkfNh 0  0.00/0.00/0.00 echo 
9 finished /tmp/ts-out.8ewxzl 0  0.01/0.00/0.00 echo 
10 finished /tmp/ts-out.ahSLaY 0  0.00/0.00/0.00 bash -c echo $GPUID 
11 finished /a/home/cc/cs/yuvval/tmp/ts-out.3dpaBO 0  0.00/0.00/0.00 bash -c ls 
12 finished /tmp/ts-out.ADWkve 0  0.00/0.00/0.00 bash -c ls 
13 finished /a/home/cc/cs/yuvval/tmp/ts-out.xm0jtn -1  130.67/0.00/0.02 bash -c python infloop.py 
14 finished /tmp/ts-out.HxBqkm 0  0.00/0.00/0.00 bash -c echo 11 
15 finished /tmp/ts-out.ERNuaE 0  0.00/0.00/0.00 bash -c echo 
16 finished /tmp/ts-out.9j6hkS 0  0.00/0.00/0.00 bash -c echo $GPUID 
17 finished /tmp/ts-out.Y5QDNa 0  0.00/0.00/0.00 bash -c echo $GPUID 
18 finished /tmp/ts-out.EIHhoX -1  0.00/0.00/0.00 %s 
19 finished /tmp/ts-out.LLw2Wl -1  0.00/0.00/0.00 
20 finished /tmp/ts-out.deWAJR -1  0.01/0.00/0.00 echo $GPUID 
21 finished /tmp/ts-out.AdZFIf -1  0.00/0.00/0.00 echo 12 
22 finished /tmp/ts-out.NBOCVv 0  0.00/0.00/0.00 echo 12 
23 finished /tmp/ts-out.5WpfPu 0  0.00/0.00/0.00 echo 
24 finished /tmp/ts-out.1lw4bS -1  0.00/0.00/0.00 echo 
25 finished /tmp/ts-out.7MNGLQ 0  0.00/0.00/0.00 bash -c echo $GPUID 
26 finished /tmp/ts-out.8FZ3on 0  0.00/0.00/0.00 bash -c echo $GPUID 

내 최고의 시도했다 :

from StringIO import StringIO as sIO 
std = ... # the table text 
pd.read_table(sIO(std), sep='\s+', engine='python') 

오류 :

ValueError: Expected 7 fields in line 2, saw 9 

편집 : 테이블을 사용할 수 생성 소스 코드. 다음은 각 행을 생성하는 명령입니다. 테이블을 데이터 프레임으로 읽는 데 도움이 될 수 있습니까?

if (p->label) 
    snprintf(line, maxlen, "%-4i %-10s %-20s %-8i %0.2f/%0.2f/%0.2f %s[%s]" 
      "%s\n", 
      p->jobid, 
      jobstate, 
      output_filename, 
      p->result.errorlevel, 
      p->result.real_ms, 
      p->result.user_ms, 
      p->result.system_ms, 
      dependstr, 
      p->label, 
      p->command); 
else 
    snprintf(line, maxlen, "%-4i %-10s %-20s %-8i %0.2f/%0.2f/%0.2f %s%s\n", 
      p->jobid, 
      jobstate, 
      output_filename, 
      p->result.errorlevel, 
      p->result.real_ms, 
      p->result.user_ms, 
      p->result.system_ms, 
      dependstr, 
      p->command); 
+0

이 탭으로 구분되어 있습니까? 'sep = '\ t'' 시도 – EdChum

+0

@EdChum, no. '\ t'을 사용하여 모든 열을 하나의 열에 넣으십시오. – yuval

+1

'df = pd.read_csv ('file', sep = r '\ s {2,}', engine = 'python')'은 어떨까요? - separator는 regex입니다 -'2 개 이상의 공백 ' – jezrael

답변

0

그것은 성가신의 종류의하지만 구분이 출력 로그 (때로는 탭과 마지막 열에서 일반적으로 하나 개의 공간 때로는 여러 공간 등)에 일치하지 않기 때문에 그것은에 적용되는 추가 로직없이 구문 분석하기 어렵다 팬더로 파싱하기 전에 개인적으로 python으로 파일을 열어서 수정 한 다음 pandas로로드하는 것을 좋아하지 않으므로 파이썬에서 파일을로드하기 전에 짧은 파이프 라인을 추가하십시오 (사용하는 경우 매우 간단합니다). linux 그리고 로그 텍스트가 파일에서로드 된 경우). 당신은 추가 할 수 있습니다

cat logfile.log | sed -r 's/\s\s+/,/g' | sed -e 's/\([[:digit:]].[[:digit:]]\{2\}\) /\1,/' > logfile.csv 

그런 다음 당신은 쉼표로 모든 공간뿐만 아니라 마지막, 문제 공간을 대체합니다. CSV로 팬더에로드 한 후

ID,State,Output,E-Level,Times(r/u/s),Command [run=1/2] 
6,running,/tmp/ts-out.FzVneG,[l1]python infloop.py 
0,finished,/tmp/ts-out.ixWHm2,0,0.00/0.00/0.00,bash -c echo 1 
1,finished,/tmp/ts-out.ZzwS11,0,0.00/0.00/0.00,bash -c echo 1 
2,finished,/tmp/ts-out.GJlyge,2,0.00/0.00/0.00,bash -c 
4,finished,/tmp/ts-out.lIVMYH,2,0.00/0.00/0.00,bash -c -h 
5,finished,/tmp/ts-out.8EKHy1,-1,141.23/0.00/0.00,python infloop.py 
3,finished,/tmp/ts-out.lBr4Wy,-1,2545.36/0.00/0.02,bash -c python infloop.py 
7,finished,/tmp/ts-out.kxCczi,2,0.01/0.00/0.00,bash -c 
8,finished,/tmp/ts-out.3VkfNh,0,0.00/0.00/0.00,echo 

을 그리고 :

import pandas as pd 
my_df = pd.read_csv(my_log_file) 

을 미안 해요 그것이 재미 순수 파이썬 아니라고

ID State  Output    E-Level Times(r/u/s) Command [run=1/2] 
6 running /tmp/ts-out.FzVneG       [l1]python infloop.py 
0 finished /tmp/ts-out.ixWHm2 0  0.00/0.00/0.00 bash -c echo 1 
1 finished /tmp/ts-out.ZzwS11 0  0.00/0.00/0.00 bash -c echo 1 
2 finished /tmp/ts-out.GJlyge 2  0.00/0.00/0.00 bash -c 
4 finished /tmp/ts-out.lIVMYH 2  0.00/0.00/0.00 bash -c -h 
5 finished /tmp/ts-out.8EKHy1 -1  141.23/0.00/0.00 python infloop.py 
3 finished /tmp/ts-out.lBr4Wy -1  2545.36/0.00/0.02 bash -c python infloop.py 
7 finished /tmp/ts-out.kxCczi 2  0.01/0.00/0.00 bash -c 
8 finished /tmp/ts-out.3VkfNh 0  0.00/0.00/0.00 echo 

이 사람 : 텍스트는 다음에서 변 솔루션이지만 bash 부분은 파이썬 부분을 훨씬 쉽게 만든다고 생각합니다.

+1

감사합니다. 작동하는 한'sed'는 괜찮습니다. 그러나 귀하의 솔루션은 여전히 ​​부적합한 공간 문제를 해결하지 못합니다. 예를 들어, 두 번째 csv 줄을 보시려면, [l1] python infloop.py 전에 추가 명령이 있어야합니다. – yuval

+0

은 추가 * 쉼표를 말하려고합니다. – yuval

+1

죄송합니다. 어떤 이유로 나는 행이 마지막 열과 두 열이 누락 된 것으로 생각했습니다. 중간. –