将一个文件剪切成多个文件(Java)
Cut a file in multiple files (Java)
我需要你的帮助。
我使用 Talend ESB,我想制作 java 个 bean。
例如,我有这个平面文件:
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 行。
如果我的原始文件中有四个订单 ==> 我想要四个文件。
如果我的原始文件中有五个订单 ==> 我想要五个文件。
等等
.....................
这是我的开始代码。
我想分成多个文件。
我真的不知道该怎么做。
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();
}
}
}
}
提前致谢。
路易莎。
编辑:我的新代码,但我不知道如何 return 文件。
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();
}
}
}
}
许多人似乎认为您不应该拆分文件。但是如果你必须这样做,一个简单的解决方案是读入你的文件,我在下面称之为 flatfile.txt
,并检查每一行的第二个条目,看看它是 1855
还是 [=13] =].在每种情况下,然后将输出写入适当的文件。
try {
File f1 = new File("f1855.txt");
File f2 = new File("f1856.txt");
if (!f1.exists()) {
f1.createNewFile();
}
FileWriter fw1 = new FileWriter(f1.getAbsoluteFile());
BufferedWriter bw1 = new BufferedWriter(fw1);
if (!f2.exists()) {
f2.createNewFile();
}
FileWriter fw2 = new FileWriter(f2.getAbsoluteFile());
BufferedWriter bw2 = new BufferedWriter(fw2);
String currLine;
BufferedReader br = new BufferedReader(new FileReader("flatfile.txt"));
while ((currLine = br.readLine()) != null) {
String[] parts = currLine.split(" ");
if (parts[1].equals("1855")) {
bw1.write(currLine);
}
else if (parts[1].equals("1856")) {
bw2.write(currLine);
}
else {
System.out.println("Found a line which did not match 1855 or 1856.");
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) br.close();
if (bw1 != null) bw1.close();
if (bw2 != null) bw2.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
这个回答真的是用户 Ranx, from the Camel list, 不是我自己的;但是,我认为它值得复制,因为它很优雅并且保持了骆驼的成语。
概念上,您想要拆分 文件中的记录。然后,对于每条记录,您想使用一些值来选择 目的地output-file。
用户 Ranx 在 Camel 列表中提供的 Camel-specific 解决方案使用了 Camel 功能:目标文件名可以从消息中的值(它是你规格的一部分)。
您拆分成记录,然后将字符串解组为某种格式,拉出所需的字段并将其设置为 header,将其编组回字符串,最后写入文件(追加),使用 header 文件名中的值。
片段中表达了这一点:
from("file:/inbox")
.split(body())
.unmarshal(dataFormat)
.setHeader("fileName",simple("${body.identifier}"))
.marshal(dataFormat)
.to("file:/outbox/?fileName=${header.fileName}.txt&fileExist=Append")
或者,您可能可以避免编组和解组,并使用读取字符串 body as-is 的简单处理器,并如上所述设置 header。这将是:
我需要你的帮助。 我使用 Talend ESB,我想制作 java 个 bean。
例如,我有这个平面文件:
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 行。
如果我的原始文件中有四个订单 ==> 我想要四个文件。
如果我的原始文件中有五个订单 ==> 我想要五个文件。
等等 .....................
这是我的开始代码。 我想分成多个文件。 我真的不知道该怎么做。
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();
}
}
}
}
提前致谢。
路易莎。
编辑:我的新代码,但我不知道如何 return 文件。
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();
}
}
}
}
许多人似乎认为您不应该拆分文件。但是如果你必须这样做,一个简单的解决方案是读入你的文件,我在下面称之为 flatfile.txt
,并检查每一行的第二个条目,看看它是 1855
还是 [=13] =].在每种情况下,然后将输出写入适当的文件。
try {
File f1 = new File("f1855.txt");
File f2 = new File("f1856.txt");
if (!f1.exists()) {
f1.createNewFile();
}
FileWriter fw1 = new FileWriter(f1.getAbsoluteFile());
BufferedWriter bw1 = new BufferedWriter(fw1);
if (!f2.exists()) {
f2.createNewFile();
}
FileWriter fw2 = new FileWriter(f2.getAbsoluteFile());
BufferedWriter bw2 = new BufferedWriter(fw2);
String currLine;
BufferedReader br = new BufferedReader(new FileReader("flatfile.txt"));
while ((currLine = br.readLine()) != null) {
String[] parts = currLine.split(" ");
if (parts[1].equals("1855")) {
bw1.write(currLine);
}
else if (parts[1].equals("1856")) {
bw2.write(currLine);
}
else {
System.out.println("Found a line which did not match 1855 or 1856.");
}
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br != null) br.close();
if (bw1 != null) bw1.close();
if (bw2 != null) bw2.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
这个回答真的是用户 Ranx, from the Camel list, 不是我自己的;但是,我认为它值得复制,因为它很优雅并且保持了骆驼的成语。
概念上,您想要拆分 文件中的记录。然后,对于每条记录,您想使用一些值来选择 目的地output-file。
用户 Ranx 在 Camel 列表中提供的 Camel-specific 解决方案使用了 Camel 功能:目标文件名可以从消息中的值(它是你规格的一部分)。
片段中表达了这一点:
from("file:/inbox")
.split(body())
.unmarshal(dataFormat)
.setHeader("fileName",simple("${body.identifier}"))
.marshal(dataFormat)
.to("file:/outbox/?fileName=${header.fileName}.txt&fileExist=Append")
或者,您可能可以避免编组和解组,并使用读取字符串 body as-is 的简单处理器,并如上所述设置 header。这将是: