CSV 파일을 읽고 (및 쓰기) Java 라이브러리를 추천 할 수 있습니까? [닫은
문제
CSV (Comma value 개체) 파일 (java value 객체)에 대한 판독, 구문 분석, 검증 및 매핑을위한 Java 라이브러리를 추천 할 수 있습니까?
해결책
우리는 사용했습니다http://opencsv.sourceforge.net/좋은 성공으로
또한 좋은 링크와 함께 또 다른 질문을 발견했습니다.CSV를 XML 파일로 변환하려는 Java Lib 또는 앱?
다른 팁
슈퍼 CSV CSV 파일을 Pojos에 읽고, 구문 분석하고, 검증하고, 매핑하는 데 좋은 선택입니다!
우리 (Super CSV 팀)는 방금 새 버전을 출시했습니다 ( 다운로드 Sourceforge 또는 Maven에서).
CSV 파일을 읽습니다
다음 예제가 사용됩니다 CsvDozerBeanReader
(방금 릴리스 한 새로운 독자 도저 깊은 매핑 및 인덱스 기반 매핑 지원을 사용한 Bean 매핑의 경우) - 그것은 우리의 예제를 기반으로합니다. 웹 사이트. 도저 기능이 필요하지 않은 경우 (또는 간단한 독립형 종속성을 원하면) 사용할 수 있습니다. CsvBeanReader
대신 (이것을 참조하십시오 코드 예제).
예제 CSV 파일
다음은 설문 조사에 대한 응답을 나타내는 예제 CSV 파일입니다. 헤더와 3 행의 데이터가 있으며 모두 8 개의 열이 있습니다.
age,consentGiven,questionNo1,answer1,questionNo2,answer2,questionNo3,answer3
18,Y,1,Twelve,2,Albert Einstein,3,Big Bang Theory
,Y,1,Thirteen,2,Nikola Tesla,3,Stargate
42,N,1,,2,Carl Sagan,3,Star Wars
CSV에서 Pojo 로의 매핑 정의
CSV의 각 행은 a로 읽습니다 감시 대응 클래스는 각각 목록이 있습니다 대답에스. 매핑이 작동하려면 클래스가 유효한 javabeans 여야합니다 (즉, 기본값 No-Arg 생성자가 있고 각 필드에 대해 Getters/Setter가 정의되어 있음).
Super CSV에서는 간단한 문자열 배열로 매핑을 정의합니다. 배열의 각 요소는 CSV 파일의 열에 해당합니다.
와 함께 CsvDozerBeanMapper
당신이 사용할 수있는:
간단한 필드 매핑 (예 :
firstName
)깊은 매핑 (예 :
address.country.code
)인덱스 매핑 (예 :
middleNames[1]
- 배열 또는 컬렉션에 대한 제로 기반 인덱스)Deep + indexed 매핑 (예 :
person.middleNames[1]
)
다음은이 예제의 필드 매핑입니다. 다음의 조합을 사용합니다.
private static final String[] FIELD_MAPPING = new String[] {
"age", // simple field mapping (like for CsvBeanReader)
"consentGiven", // as above
"answers[0].questionNo", // indexed (first element) + deep mapping
"answers[0].answer",
"answers[1].questionNo", // indexed (second element) + deep mapping
"answers[1].answer",
"answers[2].questionNo",
"answers[2].answer" };
변환 및 검증
Super CSV에는 유용한 라이브러리가 있습니다 셀 프로세서, CSV 파일에서 다른 데이터 유형 (예 : 날짜, 정수)으로 문자열을 변환하는 데 사용할 수 있습니다.
셀 프로세서를 사용합니다 전적으로 선택 사항 - 그들없이 CSV의 각 열은 문자열이되므로 각 필드는 문자열이어야합니다.
다음은 예제의 셀 프로세서 구성입니다. 필드 매핑과 마찬가지로 배열의 각 요소는 CSV 열을 나타냅니다. 셀 프로세서가 CSV 데이터를 필드의 데이터 유형으로 변환하는 방법과 이들이 함께 연결되는 방법을 보여줍니다.
final CellProcessor[] processors = new CellProcessor[] {
new Optional(new ParseInt()), // age
new ParseBool(), // consent
new ParseInt(), // questionNo 1
new Optional(), // answer 1
new ParseInt(), // questionNo 2
new Optional(), // answer 2
new ParseInt(), // questionNo 3
new Optional() // answer 3
};
독서
Super CSV로 읽는 것은 매우 유연합니다. Reader
(따라서 파일, 클래스 경로, zip 파일 등을 읽을 수 있으며 구분 기 및 견적 문자는 선호도 (대부분의 사용법을 수용하는 사전 정의 된 구성이 많이 있습니다).
아래 코드는 꽤 자명합니다.
독자를 만듭니다 (당신과 함께
Reader
및 선호도)(선택적으로) 헤더를 읽으십시오
Bean 매핑을 구성하십시오
계속 전화하십시오
read()
당신이 얻을 때까지null
(파일 끝)독자를 닫으십시오
암호:
ICsvDozerBeanReader beanReader = null;
try {
beanReader = new CsvDozerBeanReader(new FileReader(CSV_FILENAME),
CsvPreference.STANDARD_PREFERENCE);
beanReader.getHeader(true); // ignore the header
beanReader.configureBeanMapping(SurveyResponse.class, FIELD_MAPPING);
SurveyResponse surveyResponse;
while( (surveyResponse =
beanReader.read(SurveyResponse.class, processors)) != null ) {
System.out.println(
String.format("lineNo=%s, rowNo=%s, surveyResponse=%s",
beanReader.getLineNumber(), beanReader.getRowNumber(),
surveyResponse));
}
} finally {
if( beanReader != null ) {
beanReader.close();
}
}
산출:
lineNo=2, rowNo=2, surveyResponse=SurveyResponse [age=18, consentGiven=true, answers=[Answer [questionNo=1, answer=Twelve], Answer [questionNo=2, answer=Albert Einstein], Answer [questionNo=3, answer=Big Bang Theory]]]
lineNo=3, rowNo=3, surveyResponse=SurveyResponse [age=null, consentGiven=true, answers=[Answer [questionNo=1, answer=Thirteen], Answer [questionNo=2, answer=Nikola Tesla], Answer [questionNo=3, answer=Stargate]]]
lineNo=4, rowNo=4, surveyResponse=SurveyResponse [age=42, consentGiven=false, answers=[Answer [questionNo=1, answer=null], Answer [questionNo=2, answer=Carl Sagan], Answer [questionNo=3, answer=Star Wars]]]
추가 정보
당신은 더 많은 정보를 찾을 수 있습니다 웹 사이트!
추천 할 수 있습니다 SuperCSV. 사용하기 쉽고 필요한 모든 것을했습니다.
이봐, 나는 그것을위한 오픈 소스 프로젝트가있다 : jfilehelpers. 주요 장점은 Java 주석을 사용한다는 것입니다.
이 콩이있는 경우 :
@FixedLengthRecord()
public class Customer {
@FieldFixedLength(4)
public Integer custId;
@FieldAlign(alignMode=AlignMode.Right)
@FieldFixedLength(20)
public String name;
@FieldFixedLength(3)
public Integer rating;
@FieldTrim(trimMode=TrimMode.Right)
@FieldFixedLength(10)
@FieldConverter(converter = ConverterKind.Date,
format = "dd-MM-yyyy")
public Date addedDate;
@FieldFixedLength(3)
@FieldOptional
public String stockSimbol;
}
이 파일을 구문 분석하고 싶습니다.
....|....1....|....2....|....3....|....4
1 Antonio Pereira 10012-12-1978ABC
2 Felipe Coury 201-01-2007
3 Anderson Polga 4212-11-2007DEF
당신이해야 할 일은 이것입니다.
FileHelperEngine<Customer> engine =
new FileHelperEngine<Customer>(Customer.class);
List<Customer> customers =
new ArrayList<Customer>();
customers = engine.readResource(
"/samples/customers-fixed.txt");
또한 마스터-디테일, 날짜 및 형식 변환 등을 지원합니다. 당신이 무슨 생각을하는지 제게 알려주세요!
친애하는!
나는 찾았다 플랫 팩 기발한 CSV 파일을 처리하는 데 정말 좋습니다 (탈출, 따옴표, 나쁜 레코드 등).
XML 질문에 대한 CSV 파일은 이전에 내 모든 질문에 대답하는 것 같습니다.
OpenCSV (http://opencsv.sourceforge.net/) 또한 열 위치 매핑 전략을 사용하여 Javabean에 결합합니다.
ColumnPositionMappingStrategy strat = new ColumnPositionMappingStrategy();
strat.setType(YourOrderBean.class);
String[] columns = new String[] {"name", "orderNumber", "id"}; // the fields to bind do in your JavaBean
strat.setColumnMapping(columns);
CsvToBean csv = new CsvToBean();
List list = csv.parse(strat, yourReader);
JSEFA (http://jsefa.sourceforge.net) 또한 내가 필요한 모든 것을 수행하는 것 같습니다 - 특히 Java 객체와의 구속력 - FLR 및 XML을 지원하는 것 외에도
보다 CVSBEANS