2012-10-09 3 views
2

내 파일의 형식은 다음 구문 분석 된 파일에서 데이터를로드하는 방법 대부분의 효율적인은 :MySQL은,

Table1; Info 
rec_x11;rec_x21;rec_x31;rec_x41 
rec_x12;rec_x22;rec_x32;rec_x42 
... 
\n 
Table2; Info 
rec_x11;rec_x21;rec_x31;rec_x41 
rec_x12;rec_x22;rec_x32;rec_x42 
... 
\n 
Table3; Info 
rec_x11;rec_x21;rec_x31;rec_x41 
rec_x12;rec_x22;rec_x32;rec_x42 
... 

TABLEX 헤더 후 다음 줄에서 시작하여 빈 줄 구분 기호로 끝나는 기록의 각 배치에 대한 것입니다 700-800 선 크기.

라인 (rec_xyz ...) 각각 같은 일괄 배치의 헤더에 표시된 관련 의 MyISAM 테이블 이름으로 가져와야 (TableX)

나는 파이프 라인에 대한 옵션을 잘 알고 쉘 명령을 사용하여 LOAD DATA 명령으로 스트리밍하십시오.

이 파일을 구문 분석하고 매번 레코드의 일괄 처리에 대해 LOAD DATA를 실행하는 간단한 Java 스 니펫 코드에 관심이 있습니다 (for 루프 및 seek 명령 사용).

지금은 IGNORE LINES를 사용하여 처리 된 레코드를 건너 뛰지 만, 아래 줄을 무시하는 옵션이있는 경우 익숙하지 않습니다.

이 유형의 파일을 구문 분석하고 DB에로드하는 데 더 효율적인 방법이 있습니까? 내가 JDBC는 5.1.3부터 ​​LOAD DATA에 입력 스트림을 지원 읽고

편집, 내가 입력 스트림을 사용하여 파일을 반복하고 LOAD DATA 문 각 시간을 변경하는 데 사용할 수 있습니다?

내가 솔루션으로 내 코드를 부착하고
+0

로 BoneCP를 사용하고 사용자가 검색 및 다른'로드 DATA' 명령에 추가 할 각 테이블에 대해 대체 할 수 있습니까? – Kermit

답변

1

,

이 솔루션은 additional functionality (setLocalInfileInputStream)를 기반으로 MySQL의 커넥터/J 5.1.3 이후 추가.

직접 파일 URL을 사용하는 대신 LOAD DATA INTO 문에 파이프 라이닝 입력 스트림입니다.

추가 정보 : 나는 연결 풀

public final void readFile(final String path) 
     throws IOException, SQLException, InterruptedException { 
    File file = new File(path); 

    final Connection connection = getSqlDataSource().getConnection(); 
    Statement statement = SqlDataSource.getInternalStatement(connection.createStatement()); 

    try{ 
     Scanner fileScanner = new Scanner(file); 
     fileScanner.useDelimiter(Pattern.compile("^$", Pattern.MULTILINE)); 

     while(fileScanner.hasNext()){ 
      String line; 
      while ((line = fileScanner.nextLine()).isEmpty()); 

      InputStream is = new ByteArrayInputStream(fileScanner.next().getBytes("UTF-8")); 
      String [] tableName = line.split(getSeparator()); 
      setTable((tableName[0]+"_"+tableName[1]).replace('-', '_')); 

      String sql = "LOAD DATA LOCAL INFILE '" + SingleCsvImportBean.getOsDependantFileName(file) + "' " 
        + "INTO TABLE " + SqlUtils.escape(getTable()) 
        + "FIELDS TERMINATED BY '" + getSeparator() 
        + "' ESCAPED BY '' LINES TERMINATED BY '" + getLinefeed() + "' "; 
      sql += "(" + implodeStringArray(getFields(), ", ") + ")";  
      sql += getSetClause(); 

      ((com.mysql.jdbc.Statement) statement).setLocalInfileInputStream(is); 
      statement.execute(sql);   
     } 
    }finally{ 
     statement.close(); 
     connection.close(); 
    } 
} 
+0

https://stackoverflow.com/questions/34826934/fast-import-data-to-mysql-in-java/34827006#34827006 참고로 내 DB가 Linux에 있고 Java 코드가 실행되는 경우에도 내 질문이 동일합니다. Windows 그럼 파일에 데이터로드 쿼리가 실패합니다. 다른 대안은 없습니까? – user2176576