나는 많은 데이터 병합 인쇄를 수행하고 있으며 대규모 데이터베이스에서 10개의 샘플을 출력할 수 있기를 원합니다. 내 목표는 제공된 .csv(첫 번째 행과 마지막 행 포함)에서 균등한 간격의 행 10개를 추출하여 새 .csv 파일로 출력하는 것입니다.
답변1
이 답변에서는 csv 파일에 한 줄에 한 줄이 있다고 가정합니다. 즉, 연속된 행이 없음을 의미합니다. 파일 이름이 이면 db.csv
다음 명령을 사용하여 첫 번째 줄과 마지막 줄을 포함하여 10줄을 가져올 수 있습니다.
awk 'FNR==NR{next} FNR==1{n=NR-1} FNR>x || FNR==n{x+=n/9;print}' db.csv db.csv
어떻게 작동하나요?
csv 파일은 명령줄에 두 번 나열되므로 awk
두 번 읽히게 됩니다. 첫 번째는 총 행 수를 가져오는 데 사용됩니다. 두 번째 시간은 선택한 10줄을 인쇄하는 데 사용됩니다.
FNR==NR{next}
NR
지금까지 읽은 총 레코드(행) 수입니다. 파일 레코드 번호는FNR
지금까지 이 파일에서 읽은 레코드(라인)의 총 개수와 같습니다. 그래서 그 당시FNR==NR
우리는 여전히 첫 번째 파일을 읽고 있었습니다. 그렇다면next
기록으로 이동합니다.FNR==1{n=NR-1}
이 명령에 도달하면 두 번째 읽기의 첫 번째 줄에 있다는 의미입니다. 이 경우 파일의 총 레코드 수가 임을 알 수 있습니다
NR-1
. 이 번호를n
.FNR>x || FNR==n{x+=n/9;print}
두 번째 줄의 첫 번째 줄을 읽고
FNR==1
,x=0
. 그래서FNR>x
우리는 그 줄을 인쇄합니다. 그런 다음 한 번에 한 줄씩 증가x
하고 인쇄합니다 .n/9
FNR>x
이 조건을
FNR==n
사용하면 파일의 마지막 줄이 인쇄됩니다.
예
101줄의 파일을 만들어 보겠습니다.
$ seq 101 >db.csv
이제 awk
다음 명령을 사용하여 파일의 첫 번째 줄과 마지막 줄을 포함하여 10줄을 인쇄할 수 있습니다.
$ awk 'FNR==NR{next} FNR==1{n=NR-1} FNR>x || FNR==n{x+=n/9;print}' db.csv db.csv
1
12
23
34
45
57
68
79
90
101
답변2
다음을 시도해 보세요
SELECT your_column1, your_column2
FROM your_table_name
INTO OUTFILE '/tmp/ouput.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';
이는 Windows의 Linux 대체에 적용됩니다.
INTO OUTFILE '/tmp/output.csv'
그리고
INTO OUTFILE 'c:\output.csv'
답변3
CSV 파일이 제한되지 않고 필드 값에 줄 바꿈과 쉼표가 포함된 경우 Python에서 사용할 수 있는 표준 라이브러리 중 하나와 같은 실제 CSV 구문 분석 라이브러리를 사용해야 합니다.
import csv
def select_evenly(file_name, nr):
rows = []
with open(file_name) as fp:
for row in csv.reader(fp):
rows.append(row)
nr_rows = len(rows)
step = (nr_rows - 2.0) / (nr - 1)
yield rows[0]
for x in range(1, nr-1):
yield rows[int(x * step + 0.5)]
yield rows[-1]
for line in select_evenly("test.csv", 10):
print line