2012-11-25 3 views
0

다음 작업을 수행하고 싶습니다. 그렇기 때문에 내가 계획 한 방식대로 할 수 있을지 모르겠으나 궁금한 점이 있습니다.Rhino에서 CVS 파일의 데이터 구조를 동적으로 사용하는 방법 - 클래스

사용자가 XML 또는 CSV 파일을로드하고 해당 내용을 조작하고 사용할 수 있도록 Java 프로그램을 작성하고 싶습니다. Rhino 또는 Beanshell과 같은 일종의 스크립트 환경. 스크립팅은 다음과 비슷한 모습이 될 것

var myData = new dataLoader(“some_file.csv”); 
myData.load(); // should load the content 
(while myData.next()) { 
    If(myData.status == “pending”) { 
    myData.value = myData.value + 1; 
    myData.status = “updated”; //set new status 
    myData.update(); //update dataset 
    } 
} 

Some_file.csv :

"값"; "지위";

"1"; "계류 중";

"21"; "계류 중";

"341"; "계류 중";

가능합니까 (파일의 내용을 기반으로 메소드/함수/변수를 동적으로 제공합니까)? 그렇다면 내 클래스 "dataLoader"는 어떤 모양이어야합니까? 나는 또한 조언을 한 부분을보고 시작할 곳을 고맙게 생각합니다. 는이 작업을 수행하는 has a function 것을는 BufferedReader 방법 readLine 또는 구아바를 통해 잠시을 사용하여, 당신은 아마 파일의 모든 라인을 읽어들이는 클래스를 생성 할 스테파니

답변

0

, 당신의 도움을 주셔서 감사합니다. XML의 경우 트리 안의 모든 파일을로드하는 DOM 구문 분석기가 필요합니다.

그런 다음 데이터를 LinkedList 또는 배열에 저장하고 정수 변수를 색인으로 사용하십시오. next() 메서드를 호출하면 인덱스가 증가하고 배열의 크기와 같으면 false를 반환하고 그렇지 않으면 true를 반환합니다. 또한 값과 상태를 새 값으로 설정합니다.

Update() 물론 인덱스 값의 값을 필드 값으로 업데이트합니다.

디스크에 구조를 쓰는 것이 문제입니다. next()에 대한 마지막 호출에서이 작업을 수행 할 수 있습니다. 끝까지 반복 호출 될 것이라 확신하는 경우 flush()과 같은 메소드를 작성하여 파일에 배열을 씁니다. 또 다른 방법은 update() 방법으로 작성하는 것인데, 이는 가장 적합한 것으로 보입니다.

호기심에 대해 뭐하고 있니?

+0

안녕하세요 Jackop, 답장을 보내 주셔서 감사합니다.우리 대학교에는 평가 목적을위한 몇 가지 스크립트가 있습니다. 내 목표는 하나의 Java 응용 프로그램에서 이러한 모든 다른 스크립트를 함께 가져 오는 것입니다. 이 모든 방법들이 공통적으로 가지고있는 유일한 것은 측정 데이터가 CVS 또는 XML 파일에 저장된다는 것입니다. 파일을 읽는 것이 한 가지 문제이지만 제안 사항 덕분에 지금 생각할 수 있습니다. 다른 문제는 데이터에 액세스하는 방법입니다. 파일의 구조가 다르기 때문에 필자는 일종의 "동적 변수 작성기"가 필요합니다 ... 여기에 뭔가가 누락 되었습니까? 감사합니다. – Stephanie

+0

얼마나 다른가에 따라 다르며, 어떤 종류의 구조인지 판단 할 수 있습니다. CSV 파일의 열이 다르다는 뜻입니까? 즉, 때로는 다른 데이터가 있고 열의 순서가 다른 경우가 있습니까? – Jacopofar

+0

예, 대부분의 파일에는 다른 열이 있습니다. Java 컴파일 중에이 열이 무엇인지 알 수 없습니다. 따라서 Rhino가 사용자에게 "적시에"코딩 방법을 제공 할 생각이었습니다. – Stephanie

0

이것은 매우 재미있는 프로젝트가 될 것이고 나는 그것을 할 수 있다고 확신합니다.

나는 다음과 같은 데이터가 들어있는 BeanShell이다 경량 스크립트 객체를 사용을 염두에두고

myData(value, status) { 
    return this; 
    }; 

    listofitems = new java.util.List(); 
    for(entry : data) { 
    listofitems.add(myData(entry.value, entry.status); 
    } 

과 가정을 사용하여 스크립트를 동적으로 반대 구축 할 수 있습니다, CSV 파일의 라인을 구문 분석하고 헤더를 얻을 :

hdr1 = "value"; 
hdr2 = "status"; 
scriptedObjectStr = "myData(" + hdr1 + "," + hdr2 + ") { return this; }"; 

eval(scriptedObjectStr); 


y = myData("Test", "Pending"); 
print(y.value); // Test 
print(y.status); // Pending 

당신이하려는 일을 성취하기 위해서 무엇인가를 할 수 있기를 바랍니다.