2016-06-30 1 views
0

나는 자바로 텍스트 파일을 파싱하는 것에 상당히 익숙하다. 나의 작업은 내가 (예) 다음과 같은 문자열과 Double 값이 포함 된 텍스트 파일이 입니다 :스캐너를 사용하여 문자열 쌍과 두 쌍 벡터 구문 분석?

단어를 0.6478 1.74837 -0.2734 3.3475nextword 4.94756 -0.46372 3.29384 0.36475thirdword 5.92836 (...)

(등등)

이 파일에는 다음과 같은 일관된 수의 단어가 포함되어있어 어떤 방식 으로든 n 개의 숫자 값이 이어집니다. 내가 원하는 것은 파일의 모든 단어와 모든 단어에 대해 n 개의 Doubles와 연관된 벡터를 포함하는 문자열 집합입니다.

첫 번째 아이디어는 java.util.Scanner를 사용하는 것이지만, 필자가 알고있는 한 공백으로 구분 된 항목 만 읽으며 내보기에서 볼 수 있듯이 그룹의 마지막 번호와 다음 단어.

스캐너를 사용하는 동안이 문제를 쉽게 해결할 수 있나요? 아니면 다른 구문 분석 도구로 더 쉽게 해결할 수 있습니까?

나는 어떤 조언

에 대한 감사 해요

UPDATE :

내가 또 다른 문제가 있습니다. 내 입력 파일에 다음과 같은 지수가 포함되어 있습니다. -2.1961e-05 내 스캐너에서 숫자 -2.1961을 읽고 단어 : e-05

이 이런 종류의 문제를 해결할 기회가 있습니까?

+1

또 다른 문제는 또 다른 질문입니다. 힌트 : 더 많은 사람들이 * 새로운 * 질문 대기열을 편집 된 (* 활성화 *) 질문 대기열보다 관찰하므로 새로운 질문을 올리면 답변을 얻을 확률도 높아집니다. 어쨌든 내가 편집 한 내용을 포함하도록 답변을 업데이트했습니다. – Pshemo

답변

0

예, 기본적으로 스캐너는 구분 기호로 공백 만 사용합니다 (탭과 행 구분 기호 포함). 하지만 당신은 당신이 당신의 자신의 구분 기호를 설정할 수 있습니다 정규식 (정규 표현식)을 잘 알고있는 경우 :

  • 공백 \s

또는

  • 자리 (?<=\d) 전에
  • 이 장소와 그 뒤에 숫자가 없다. (?!\d)
  • 숫자는 .입니다 (왜냐하면 12.34a34a이어야합니다) (?![.])입니다.

(여기서는 정규식에서 긍정적이고 부정적인 미리보기 메커니즘을 사용했습니다.RE의 UPDATE

Scanner sc = new Scanner(yourData); 
sc.useLocale(Locale.ENGLISH);//some locales use 12,34 for double, English ensures 12.34 format 
sc.useDelimiter("\\s|(?<=\\d)(?!\\d)(?![.])"); 

:

sc.useDelimiter("\\s|(?<=\\d)(?!\\d)(?![.]|[eE]-?\\d+)"); 
0

한 가지 방법 (스캐너없이)이 각 라인을 tokenise하는 더 많은 정보에서 : 같은 http://www.regular-expressions.info/lookaround.html)

그래서 당신은 당신의 스캐너를 설정할 수 있습니다 간단한 정규식을 사용하고 각 토큰을 구문 분석하십시오.

String line = "word 0.6478 1.74837 -0.2734 3.3475nextword 4.94756 -0.46372 3.29384 0.36475thirdword 5.92836"; 
String nonNumeric = "[^\\d.-]"; 
//alternative: nonNumeric="[a-zA-Z\\s]" 
List<Double> doubles = Arrays 
    .asList(line.split(nonNumeric)) 
    .stream() 
    .filter(s -> !s.isEmpty()) 
    .map(s -> Double.parseDouble(s)) 
    .collect(Collectors.toList()); 
System.out.println(doubles); 

결과 :

[0.6478, 1.74837, -0.2734, 3.3475, 4.94756, -0.46372, 3.29384, 0.36475, 5.92836]