Мне нужна ваша помощь. Я использую Talend ESB, и я хочу сделать java beans.Вырезать файл в нескольких файлах (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
EDIT: Но я не знаю, количество заказов на один файл.
Если у меня есть три порядка (три строки каждый) в моем исходном файле ==> Я хочу три файла с 3 строками каждого заказа.
Если у меня есть четыре заказа в моем исходном файле ==> Я хочу четыре файла.
Если у меня есть пять заказов в моем исходном файле ==> Я хочу пять файлов.
и так далее .......................
Это мой старт-код. Я хотел бы разделить на несколько файлов. Я действительно зациклился на том, как это сделать.
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();
}
}
}
}
Заранее спасибо.
Louisa.
EDIT: Мой новый код, но я не знаю, как вернуть файл.
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();
}
}
}
}
Какова логика разделения файла? –
Hello Boris, Логика основана на полях 1855 и 1856 (позиция 7-11 в моем файле). Он должен быть объединен в 1855 и 1856 годах (два файла). – Louisa
Хорошо, просто сделайте это. 1) Откройте два файла. 2) 'stream()' строки из входного файла. 3) В зависимости от рассматриваемого поля, напишите строку в соответствующий файл. 4) Закройте файлы. –