2014-01-17 5 views
2

나는 39 열 의 마지막. 그러나 하나의 열에 길이가 100,000 자 이상의 문자열을 가진 .tsv 파일이 있습니다. 지금 어떤 일이 일어나는지는 내가 읽으려고 할 때입니다. 파일 라인 1은 헤더를 가지고 있으며, 그 데이터는.tsv 파일을 읽는 동안 대체 선을 건너 뛰기

은 무엇 일어나고있는 것은 다음의 1 행을 읽는의이 줄을 이동 한 후 3 다음 5 호선 다음 라인 7 모든 행은 내가 무엇입니까 로그 다음과 같은 데이터 을 가지고 있지만

lineNo=3, rowNo=2, customer=503837-100 , last but one cell length=111275 
lineNo=5, rowNo=3, customer=503837-100 , last but one cell length=111275 
lineNo=7, rowNo=4, customer=503837-100 , last but one cell length=111275 
lineNo=9, rowNo=5, customer=503837-100 , last but one cell length=111275 
lineNo=11, rowNo=6, customer=503837-100 , last but one cell length=111275 
lineNo=13, rowNo=7, customer=503837-100 , last but one cell length=111275 
lineNo=15, rowNo=8, customer=503837-100 , last but one cell length=111275 
lineNo=17, rowNo=9, customer=503837-100 , last but one cell length=111275 
lineNo=19, rowNo=10, customer=503837-100 , last but one cell length=111275 

다음은 m입니다. Y 코드 : 내가 잘못

답변

0

을 하겠어 어디

import java.io.FileReader; 
import org.supercsv.cellprocessor.Optional; 
import org.supercsv.cellprocessor.constraint.NotNull; 
import org.supercsv.cellprocessor.ift.CellProcessor; 
import org.supercsv.io.CsvBeanReader; 
import org.supercsv.io.ICsvBeanReader; 
import org.supercsv.prefs.CsvPreference; 

public class readWithCsvBeanReader { 
    public static void main(String[] args) throws Exception{ 
     readWithCsvBeanReader(); 
    } 


private static void readWithCsvBeanReader() throws Exception { 

    ICsvBeanReader beanReader = null; 

    try { 

     beanReader = new CsvBeanReader(new FileReader("C:\MAP TSV\abc.tsv"), CsvPreference.TAB_PREFERENCE); 
     // the header elements are used to map the values to the bean (names must match) 
     final String[] header = beanReader.getHeader(true); 
     final CellProcessor[] processors = getProcessors(); 
     TSVReaderBrandDTO tsvReaderBrandDTO = new TSVReaderBrandDTO(); 

     int i = 0; 
     int last = 0; 

     while((tsvReaderBrandDTO = beanReader.read(TSVReaderBrandDTO.class, header, processors)) != null) { 
      if(null == tsvReaderBrandDTO.getPage_cache()){ 
       last = 0; 
      } 
      else{ 
       last = tsvReaderBrandDTO.getPage_cache().length(); 
      } 
      System.out.println(String.format("lineNo=%s, rowNo=%s, customer=%s , last but one cell length=%s", beanReader.getLineNumber(), 
       beanReader.getRowNumber(), tsvReaderBrandDTO.getUnique_ID(), last)); 
      i++; 
     } 

     System.out.println("Number of rows : "+i); 

    } 
    finally { 
     if(beanReader != null) { 
      beanReader.close(); 
     } 
    } 
} 

private static CellProcessor[] getProcessors() { 

    final CellProcessor[] processors = new CellProcessor[] { 
     new Optional(), new NotNull(), new NotNull(), new NotNull(), new NotNull(), 
     new NotNull(), new NotNull(), new NotNull(), new NotNull(), new NotNull(), 
     new NotNull(), new NotNull(), new NotNull(), new NotNull(), new NotNull(), 
     new NotNull(), new NotNull(), new NotNull(), new NotNull(), new NotNull(), 
     new NotNull(), new NotNull(), new NotNull(), new NotNull(), new NotNull(), 
     new NotNull(), new NotNull(), new NotNull(), new NotNull(), new NotNull(), 
     new NotNull(), new NotNull(), new NotNull(), new NotNull(), new NotNull(), 
     new NotNull(), new NotNull(), new NotNull(), new Optional()}; 

     return processors; 
    } 
} 

은 알려 주시기 바랍니다 나는 http://supercsv.sourceforge.net/examples_reading.html를 확인했습니다. CSV 파일 예 :출력. 파서가 데이터 레코드가 두 개의 물리적 라인에 걸쳐 있다고 생각하도록 라인에 도피되지 않은 " (이중 어포 스트로피) 문자가 포함될 수 있습니까?

당신이 인용 문자로 이중 아포스트로피 문자를 사용하지 않는 경우, 당신은 CsvPreference을 변경할 수 있습니다 - http://supercsv.sourceforge.net/apidocs/org/supercsv/prefs/CsvPreference.html를 참조 - 따옴표는 따옴표로 간주되지 않도록 : 물론

CsvPreference MY_PREFERENCES = new CsvPreference.Builder(
    SOME_NEVER_USED_CHARACTER, ',', "\r\n").build(); 

이 같은 탭으로 구분 된 CSV 사용 무언가 :

CsvPreference MY_PREFERENCES = new CsvPreference.Builder(
    SOME_NEVER_USED_CHARACTER, '\t', "\r\n").build(); 

는 빌더의 서명에 대한 CsvPreference의 javadoc을 참조하고 그에 따라 실제 값을 수정.

+0

당신은 맞습니다. 이스케이프 처리되지 않은 "... 당신은 런타임 중에 그것을 처리 할 수있는 방법을 제안 할 수 있습니까? –

+0

나는 두려워합니다 : - 생성하는 응용 프로그램의 측면에서 처리하십시오 - 입력 파일을 "전처리 프로그램"을 통해 전달합니다 - 코드를 읽고 두 번 아포스트로피를 두 번 어포 스트로피로 바꾸는 코드입니다. 아마도 라이브러리가 그러한 옵션을 제공 할 수 있습니다. 그렇지 않으면 원본 파일이 아닙니다. 유효한 CSV/TSV Btw, 귀하의 질문에 대답하고 도피되지 않은 이중 어포 스트로피의 존재가 문제의 근본 원인이라면 대답으로 답변을 표시해 주시겠습니까? :) 감사. –

+0

내가 가지고있는 데이터 파일은 불일치와 문제의 이러한 종류가있을 수 있습니다 데이터 크기가 거대하고 단일 파일에 최대 100 기가 바이트 데이터를 갈 수 있습니다 ... 그래서 메모리가 부족하게 될 것이고 내가 할 수 없어 읽는 동안 이것을 처리 할 방법을 찾으려면 –

0

CSV 파서를 사용하여 TSV 입력을 구문 분석하는 경우 시간이 오래 걸릴 수 있습니다. 적절한 TSV 구문 분석기를 사용하십시오. uniVocity-parsers에는 TSV 파서/작성기가 함께 제공됩니다. 주석 된 java bean을 사용하여 파일을 클래스의 인스턴스로 직접 구문 분석 할 수 있습니다.

예 :

이 코드는 TSV를 행으로 구문 분석합니다.

TsvParserSettings settings = new TsvParserSettings(); 

// creates a TSV parser 
TsvParser parser = new TsvParser(settings); 

// parses all rows in one go. 
List<String[]> allRows = parser.parseAll(new FileReader(yourFile)); 

BeanListProcessor 자바 콩으로 분석 사용

BeanListProcessor<TestBean> rowProcessor = new BeanListProcessor<TestBean>(TestBean.class); 

TsvParserSettings parserSettings = new TsvParserSettings(); 
parserSettings.setRowProcessor(rowProcessor); 

TsvParser parser = new TsvParser(parserSettings); 
parser.parse(new FileReader(yourFile)); 

// The BeanListProcessor provides a list of objects extracted from the input. 
List<TestBean> beans = rowProcessor.getBeans(); 

TestBean 클래스처럼 보이는 방법이다 : 클래스 TestBean {

// if the value parsed in the quantity column is "?" or "-", it will be replaced by null. 
@NullString(nulls = { "?", "-" }) 
// if a value resolves to null, it will be converted to the String "0". 
@Parsed(defaultNullRead = "0") 
private Integer quantity; 


@Trim 
@LowerCase 
@Parsed(index = 4) 
private String comments; 

// you can also explicitly give the name of a column in the file. 
@Parsed(field = "amount") 
private BigDecimal amount; 

@Trim 
@LowerCase 
// values "no", "n" and "null" will be converted to false; values "yes" and "y" will be converted to true 
@BooleanString(falseStrings = { "no", "n", "null" }, trueStrings = { "yes", "y" }) 
@Parsed 
private Boolean pending; 

공개 : 나는이의 저자 도서관. 오픈 소스이며 무료입니다 (Apache V2.0 라이센스).