당신의 도움이 필요합니다. 나는 Talend ESB를 사용하는데 자바 빈을 만들고 싶다.여러 파일로 파일 잘라 내기 (Java)
예를 들어, 나는이 플랫 파일이 : 내 예에서
11886 1855 0000004309000
11886 1855 0000057370000
11886 1856 0000057374001
11886 1856 0000057375000
내가 2 개 파일 (메시지), "1855"과 "1856"의 필터를 원하는을 (그것은 주문의 수이다).
첫 번째 파일 :
11886 1855 0000004309000
11886 1855 0000057370000
두 번째 파일 :
11886 1856 0000057374001
11886 1856 0000057375000
편집 : 는하지만 파일 당 주문 번호를 알고하지 않습니다.
내 원본 파일에 3 개의 주문 (각각 3 줄)이있는 경우 ==> 각 주문의 3 줄에 3 개의 파일이 필요합니다.
원본 파일에 4 개의 주문이있는 경우 ==> 네 개의 파일이 필요합니다.
원본 파일에 5 개의 주문이있는 경우 ==> 5 개의 파일을 원합니다. 에
등 .......................
이 내 시작 코드입니다. 여러 파일로 분할하고 싶습니다. 나는 이것을하는 방법에 정말로 붙어있다.
package beans;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import org.apache.camel.*;
public class bean_test implements Processor{
private static final String ENDPOINT_NAME = "Endpoint";
private static final String END_TAG_ENDPOINT_NAME = "endEndpoint";
private static final int NUMERO_SITE_START_POSITION = 6;
private static final int NUMERO_SITE_END_POSITION = 11;
@Override
public void process(Exchange exchange) throws Exception {
ProducerTemplate producerTemplate = exchange.getContext().createProducerTemplate();
String ropEndpoint = exchange.getIn().getHeader(ENDPOINT_NAME, String.class);
String endRopEndpoint = exchange.getIn().getHeader(END_TAG_ENDPOINT_NAME, String.class);
InputStream is = new ByteArrayInputStream(exchange.getIn().getBody(String.class).getBytes());
aggregateBody(producerTemplate, is, ropEndpoint, endRopEndpoint, new HashMap<String, Object>(exchange.getIn().getHeaders()));
}
private void aggregateBody(ProducerTemplate producerTemplate, InputStream content, String ropEndPoint, String endRopEndpoint, Map<String, Object> headers){
BufferedReader br = new BufferedReader(new InputStreamReader(content));
String line;
Map<String, StringBuilder> articles = new LinkedHashMap<String, StringBuilder>();
StringBuilder aggregateFile = new StringBuilder();
try {
String lineId = null;
while((line = br.readLine()) != null){
lineId = line.substring(NUMERO_SITE_START_POSITION, NUMERO_SITE_END_POSITION);
}
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
if(br != null)br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
감사합니다.
루이지애나.
편집 : 내 새 코드가 있지만 파일을 반환하는 방법을 모르겠습니다.
package beans;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import org.apache.camel.*;
public class bean_test implements Processor{
private static final String ENDPOINT = "aggregateEndpoint";
private static final int NUMERO_SITE_START_POSITION = 46;
private static final int NUMERO_SITE_END_POSITION = 55;
@Override
public void process(Exchange exchange) throws Exception {
ProducerTemplate producerTemplate = exchange.getContext().createProducerTemplate();
String endpoint = exchange.getIn().getHeader(ENDPOINT, String.class);
InputStream is = new ByteArrayInputStream(exchange.getIn().getBody(String.class).getBytes());
aggregateBody(producerTemplate, is, endpoint, new HashMap<String, Object>(exchange.getIn().getHeaders()));
}
private void aggregateBody(ProducerTemplate producerTemplate, InputStream content, String endpoint, Map<String, Object> headers){
BufferedReader br = new BufferedReader(new InputStreamReader(content));
String line;
Set<String> order=new TreeSet<String>();
try {
String lineId = null;
while((line = br.readLine()) != null){
lineId = line.substring(NUMERO_SITE_START_POSITION, NUMERO_SITE_END_POSITION);
order.add(lineId);
}
for(int i=0;i<order.size();i++){
String key = "file" + i;
File F = new File(key);
Iterator it = order.iterator();
FileWriter fw = new FileWriter(F.getAbsoluteFile());
BufferedWriter bw = new BufferedWriter(fw);
while((line = br.readLine()) != null){
while(it.hasNext()){
lineId = line.substring(NUMERO_SITE_START_POSITION, NUMERO_SITE_END_POSITION);
if (lineId.equals(it.next())) {
bw.write(line);
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
if(br != null)br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
파일을 분할하는 논리는 무엇입니까? –
안녕하세요 보리스, 로직은 필드 1855 및 1856 (내 파일에서 위치 7-11)을 기반으로합니다. 1855 및 1856 (두 개의 파일)에 함께 집계해야합니다. – Louisa
글쎄요. 1) 두 개의 파일을 엽니 다. 2)'stream()'입력 파일의 행. 3) 해당 필드에 따라 해당 파일에 행을 작성하십시오. 4) 파일을 닫으십시오. –