작성
·
16
1
,로분리된 csv파일로 하고
public FlatFileItemReader<SystemFailure> systemFailureItemReader(
@Value("#{jobParameters['inputFile']}") String inputFile) {
return new FlatFileItemReaderBuilder<SystemFailure>()
.name("systemFailureItemReader")
.resource(new FileSystemResource(inputFile))
.delimited()
.delimiter(",")
.names("errorId",
"errorDateTime",
"severity",
"processId",
"errorMessage")
.targetType(SystemFailure.class)
.linesToSkip(1)
.strict(true)
.build();
}
----------
실행하면, 오류가 발생합니다.
PS D:\Test\springboot\kill-batch-system> ./gradlew bootRun --args='--spring.batch.job.name=systemFailureJob inputFile=d:/Test/springboot/kill-batch-system/system-failures.csv'
.....
Caused by: org.springframework.batch.item.file.transform.IncorrectTokenCountException: Incorrect number of tokens found in record: expected 5 actual 1
.....
PS D:\Test\springboot\kill-batch-system>
그런데, \t으로 구분하고,
.delimiter("\t")
로 하면 정상작동합니다. 이유가 뭘까요?
윈도우 환경입니다.
그리고, 실행시 파일의 위치를 절대경로로 주어야 하나요?
상대경로일경우, 파일의 위치를 어디에 두어야 하나요?
답변 2
1
오늘도 보는구나 빈빠형 반갑다! 💀 (출퇴근 이슈로 답변이 느린점 양해바란다)
사실 진정한 시스템 처형자는 윈도우 따위는 극혐하는 법이지만... 너의 학습 열기가 상당한 수준에 도달한 듯하여 특별히 너에게는 Windows 봉인을 풀도록 하겠다 💀
자, 너는 우리 강의에서 echo -e
명령을 사용해 데이터를 입력하도록 지시받았을 것이다. 안타깝게도 이게 Windows에서는 동작하지 않는다!
왜 그런가?echo -e
는 이스케이프 시퀀스(\n
, \t
같은 특수문자)를 해석하는 기능으로, Linux/macOS 전용 무기다. Windows의 cmd는 이런 고급 기술을 이해하지 못한다.
PowerShell 버전
@"
에러ID,발생시각,심각도,프로세스ID,에러메시지
ERR001,2024-01-19 10:15:23,CRITICAL,1234,SYSTEM_CRASH
ERR002,2024-01-19 10:15:25,FATAL,1235,MEMORY_OVERFLOW
"@ | Out-File -FilePath system-failures.csv -Encoding UTF8
CMD 버전
echo 에러ID,발생시각,심각도,프로세스ID,에러메시지 > system-failures.csv
echo ERR001,2024-01-19 10:15:23,CRITICAL,1234,SYSTEM_CRASH >> system-failures.csv
echo ERR002,2024-01-19 10:15:25,FATAL,1235,MEMORY_OVERFLOW >> system-failures.csv
킬구 스타일 간단한 해결책(강추)
: 그냥 메모장 열고 복붙하라! Windows도 감히 거부할 수 없는 방법이다!
에러ID,발생시각,심각도,프로세스ID,에러메시지
ERR001,2024-01-19 10:15:23,CRITICAL,1234,SYSTEM_CRASH
ERR002,2024-01-19 10:15:25,FATAL,1235,MEMORY_OVERFLOW
킬구의 조언: Linux 명령어가 그리우면 Git Bash를 설치하라. 그러면 진정한 시스템 파괴가 가능하다. 이제.. Windows도 너의 앞에 무릎 꿇을 것이다
오 PS라.. 역시 학습이 빠르군 💀
대답하자면 PS(PowerShell)로 절대경로로 주면 된다
inputFile=D:/Test/springboot/kill-batch-system/system-failures.csv
kill9.no.mercy@gmail.com:~$ cat /etc/sudoers
이틀 연속 질문을 올린 너에게는 특별히..
답변이 느릴 경우에 한해 메일로 찡찡대기 권한을 부여한다.
단, ACK는 보장하지 않는다. (Best Effort.. )
0
안녕하세요, 인프런 AI 인턴입니다.
빈빠님, 실행 중에 발생한 오류와 관련하여 도움을 드리고자 합니다. 주어진 상황에서 FlatFileItemReader
를 사용하여 CSV 파일을 읽을 때 특정 오류가 발생한 것으로 보입니다. 다음은 문제의 주요 원인과 해결 방법에 대한 간략한 설명입니다.
IncorrectTokenCountException 오류: 오류 메시지에서 나타나듯이, FlatFileItemReader
가 기대하는 토큰(컬럼의 수)과 실제 데이터의 열 수가 일치하지 않아서 발생한 오류입니다. 이 경우, CSV 파일이 쉼표(,)로 제대로 구분되지 않았을 가능성이 있습니다. Windows 환경에서는 일반 텍스트 편집기에서 CSV 파일이 다른 형태로 저장될 수 있습니다.
탭 구분자로 정상 작동되는 이유: .delimiter("\t")
를 사용했을 때 정상 작동한다면, CSV 파일이 실제로 쉼표 대신 탭으로 데이터가 구분되어 있는지를 확인해보실 필요가 있습니다. 일반적으로 CSV 파일은 쉼표로 구분되지만, 경우에 따라 다른 구분자가 사용될 수 있습니다.
파일 내용 확인: 파일을 메모장이나 다른 텍스트 편집기로 열어보시고, 실제 데이터가 쉼표(,) 혹은 다른 구분자로 이루어져 있는지를 확인해 보세요.
파일 저장 형식 확인: 파일이 CSV 형식으로 제대로 저장되지 않았거나, 파일을 생성할 때 다른 구분자가 사용되었을 수 있습니다. 파일이 올바르게 쉼표로 구분되어 있는지 다시 저장해보세요.
절대경로 vs 상대경로:
상대경로를 사용할 경우, 프로젝트의 루트 디렉토리나 실행하는 JAR 파일의 위치를 기준으로 파일 경로를 설정해 주셔야 합니다. 실행 위치에 따라 경로가 달라질 수 있습니다.
구체적으로 CSV 파일의 구분자를 확인하고, 필요 시 파일을 다시 저장하거나, 해당 파일의 구분자 설정을 업데이트해 보시기 바랍니다.
유사한 오류 해결 사례를 참조하려면 예시코드 오타 제보를 참고해 보시면 도움이 될 수 있습니다. 이 외에도 추가 질문이 있으시면 주저하지 말고 문의해 주세요.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.