Richard Teasdale
asked on
Splitting a file into batches
Hi:
I have a text file, extracted from a database. It is a set of instructions for a saw.
Note that column eight, beginning 169... changes from 169022 to 169023, etc.
Is there any way of breaking the file at each change of batch; creating a new file, and each file having the name of the  batch it contains. So currently the file is called 169022. I need that to be JUST 169022, with different files for each subsequent batch.
I can from the database create a text file with a list of the batches if needs be.
Java is good - but will accept anything (c++, c#, vb, etc!)
Thanks!
I have a text file, extracted from a database. It is a set of instructions for a saw.
Note that column eight, beginning 169... changes from 169022 to 169023, etc.
Is there any way of breaking the file at each change of batch; creating a new file, and each file having the name of the  batch it contains. So currently the file is called 169022. I need that to be JUST 169022, with different files for each subsequent batch.
I can from the database create a text file with a list of the batches if needs be.
Java is good - but will accept anything (c++, c#, vb, etc!)
Thanks!
ASKER
Sorry...forgot the file...
169022.txt
169022.txt
You might try this class, which contains a rather crude implementation of T for your file (but it seems to work)
import java.io.*;
import java.util.*;
public class ComparableSublistRetriever<T extends Comparable<T>>
implements Iterator<List<T>> {
private List<T> delegate;
private T previous;
private T current;
private int index;
public ComparableSublistRetriever(List<T> items) {
delegate = new ArrayList<T>(items);
Collections.sort(delegate);
}
@Override
public boolean hasNext() {
return index < delegate.size();
}
@Override
public List<T> next() {
List<T> sublist = new ArrayList<T>();
T current = delegate.get(index++);
sublist.add(current);
previous = current;
while(index < delegate.size() && (current = delegate.get(index)).equals(previous)) {
sublist.add(current);
previous = current;
index++;
}
return sublist;
}
@Override
public void remove() {
;
}
static class CsvLine implements Comparable<CsvLine> {
private String[] array;
public CsvLine(String[] array) {
this.array = array;
}
public int compareTo(CsvLine other) {
return array[7].compareTo(other.array[7]);
}
public boolean equals(Object other) {
return array[7].equals(((CsvLine)other).array[7]);
}
public String toString() {
return Arrays.toString(array);
}
}
public static void main(String[] args) throws Exception {
List<CsvLine> csvLines = new ArrayList<CsvLine>();
Scanner s = new Scanner(new File(args[0]));
while(s.hasNextLine()) {
csvLines.add(new CsvLine(s.nextLine().split("\\s+", 9)));
}
s.close();
ComparableSublistRetriever<CsvLine> r = new ComparableSublistRetriever<CsvLine>(csvLines);
while (r.hasNext()) {
System.out.println(r.next());
}
}
}
This is the code for the complete program which does it;
See attached the files produeced from your input file
169023-out.txt
169024-out.txt
169025-out.txt
169026-out.txt
169027-out.txt
See attached the files produeced from your input file
import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.HashMap;
public class SplitFile {
public SplitFile() {
try{
HashMap <String, ArrayList<String>> map = new HashMap<String, ArrayList<String>>();
ArrayList<String> names = new ArrayList<String>();
BufferedReader br = new BufferedReader((new FileReader("169022.txt")));
String buff = "";
while((buff=br.readLine()) != null){
String [] items = buff.split("[\\s]+");
if(items.length < 3)continue;
if(map.get(items[7]) != null){
ArrayList<String> ar = map.get(items[7]);
ar.add(buff);
map.put(items[7], ar);
} else
{
ArrayList<String> ar = new ArrayList<String>();
ar.add(buff);
System.out.println(items[7]);
names.add(items[7]);
map.put(items[7], ar);
}
}
br.close();
for(int j=0; j< names.size(); j++){
String name = names.get(j);
PrintStream ps = new PrintStream(new FileOutputStream(name + "_out.txt"));
ArrayList<String> ar = map.get(name);
for(String s: ar){
ps.println(s);
}
ps.close();
}
} catch(Exception ex){
ex.printStackTrace();
}
}
public static void main(String[] args) {
new SplitFile();
}
}
169022-out.txt169023-out.txt
169024-out.txt
169025-out.txt
169026-out.txt
169027-out.txt
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thank You Very Much!
ASKER