2010-04-05 4 views
22

처리 할 .csv 파일 집합이 있습니다. SQL 쿼리로 처리하는 것이 훨씬 쉬울 것입니다. .csv 파일을로드하고 SQL 언어를 사용하여 파이썬이나 루비 같은 스크립팅 언어로 조사하는 방법이 있는지 궁금합니다. ActiveRecord와 비슷한 것을 로딩하면 멋지게 될 것입니다.스크립팅 언어로 데이터베이스 즉시 변환

문제는 내가 스크립트를 실행하기 전에 데이터베이스를 어딘가에 실행하고 싶지 않다는 것입니다. 스크립팅 언어 및 일부 모듈 외부에 추가 설치가 필요하지 않았습니다.

내 질문은 어떤 언어와 모듈을이 작업에 사용해야하는지입니다. 나는 주변을 둘러 보았고 나의 필요에 맞는 것을 찾을 수 없었다. 심지어 가능할까요?

+0

답변을 즐겨 찾기로 표시하려면 (실제로는 * 답글 :) 원하는 답변의 투표 수 바로 아래에있는 체크 표시 (✓)를 클릭하십시오. 예를 들어, 당분간 nosklo의 대답은 13 표입니다. "투표 다운"삼각형 아래에 희미한 체크 마크가 있습니다. 그것을 클릭하십시오. – tzot

답변

61

sqlite3이 파이썬에 포함되어 있습니다. 이 데이터베이스를 사용하여 데이터베이스 (에 )를 만들고 행을 추가하고 SQL 쿼리를 수행 할 수 있습니다.

ActiveRecord와 비슷한 기능을 원한다면 sqlalchemy과 같은 외부 ORM을 추가해야합니다. 즉 별도의 다운로드 비록

빠른 예를 사용하여 SQLAlchemy의 :

from sqlalchemy import create_engine, Column, String, Integer, MetaData, Table 
from sqlalchemy.orm import mapper, create_session 
import csv 
CSV_FILE = 'foo.csv' 
engine = create_engine('sqlite://') # memory-only database 

table = None 
metadata = MetaData(bind=engine) 
with open(CSV_FILE) as f: 
    # assume first line is header 
    cf = csv.DictReader(f, delimiter=',') 
    for row in cf: 
     if table is None: 
      # create the table 
      table = Table('foo', metadata, 
       Column('id', Integer, primary_key=True), 
       *(Column(rowname, String()) for rowname in row.keys())) 
      table.create() 
     # insert data into the table 
     table.insert().values(**row).execute() 

class CsvTable(object): pass 
mapper(CsvTable, table) 
session = create_session(bind=engine, autocommit=False, autoflush=True) 

지금 당신이 등, 모든 필드에 의해 필터링 데이터베이스를 쿼리

것은이 CSV에 위의 코드를 실행한다고 가정 할 수 있습니다

생성 및 필드 name, age, nickname와 메모리에 테이블을 채 웁니다
name,age,nickname 
nosklo,32,nosklo 
Afila Tun,32,afilatun 
Foo Bar,33,baz 

. 자동으로 생성하고 SELECT 쿼리를 실행하고 올바른 행을 반환합니다

for r in session.query(CsvTable).filter(CsvTable.age == '32'): 
    print r.name, r.age, r.nickname 

: 그런 다음 테이블을 조회 할 수 있습니다.

sqlalchemy를 사용하는 또 다른 이점은 나중에 다른 강력한 데이터베이스를 사용하기로 결정한 경우 코드를 변경하지 않고 일시적으로 수행 할 수 있다는 것입니다.

+3

이 답변을 즐겨 찾기로 표시하려면 어떻게합니까? –

+1

와우 덕분에, 그것은 내가 원했던 것입니다. – tmoisan

4

SQLite과 같은 라이브러리에서 DB를 사용하십시오. PythonRuby 버전이 있습니다.

테이블에 CSV를로드하면 여기에서도 도움이되는 모듈/라이브러리가있을 수 있습니다. 그럼 SQL 멀리.

3

CSV 파일은 인덱스가 없으며 사용자가 부과 한 모든 SQL 시뮬레이션은 전체 내용을 반복해서 검색하는 것 이상입니다.

4

Perl 및 Text :: CSV 및 DBI에서 보셨나요? CPAN에는 정확히 이것을 수행하는 많은 모듈이 있습니다.

#!/usr/bin/perl 
use strict; 
use warnings; 
use DBI; 

# Connect to the database, (the directory containing our csv file(s)) 

my $dbh = DBI->connect("DBI:CSV:f_dir=.;csv_eol=\n;"); 

# Associate our csv file with the table name 'prospects' 

$dbh->{'csv_tables'}->{'prospects'} = { 'file' => 'prospects.csv'}; 

# Output the name and contact field from each row 

my $sth = $dbh->prepare("SELECT * FROM prospects WHERE name LIKE 'G%'"); 
$sth->execute(); 
while (my $row = $sth->fetchrow_hashref) { 
    print("name = ", $row->{'Name'}, " contact = ", $row->{'Contact'}. "\n"); 
} 
$sth->finish(); 

name = Glenhuntly Pharmacy contact = Paul 
name = Gilmour's Shoes contact = Ringo 

그냥 형 perldoc을 DBI와 perldoc을 텍스트 :: CSV 이상 명령 프롬프트에서 다음과 같습니다 (HERE에서) 예입니다.

3

스크립트 언어를 사용하여 CSV 파일을 구문 분석하고 저장 용으로 하나의 파일 만 사용하는 SQLite에 데이터를 저장할 수 있습니다. 거기에서 당신은 데이터베이스에 그것을 가지고 쿼리를 실행할 수 있습니다.

또는 Windows에서 ODBC 데이터 원본을 CSV 파일로 설정할 수 있습니다. 그러나 이것을 자동화하는 것이 어려울 수 있습니다. 당신은 내가 nosklo의 솔루션을 (감사합니다!)하지만 난 이미 열 라인 내에서 (pk_col로 전달) 기본 키를 가지고 있었다 (사용

1

PHP FlatfileDB 아주 좋은 방법입니다 csv의 첫 줄). 그래서 나는 나의 수정을 공유 할 것이라고 생각했다. 나는 삼자를 사용했다.

2

웹 응용 프로그램을 구축하는 경우 here 사용할 수

관련 문제