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!
Richard TeasdaleFinancial ControllerAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Richard TeasdaleFinancial ControllerAuthor Commented:
Sorry...forgot the file...
0
Richard TeasdaleFinancial ControllerAuthor Commented:
Sorry...forgot the file...
169022.txt
0
CEHJCommented:
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());
        }
    }
}

Open in new window

0
OWASP: Avoiding Hacker Tricks

Learn to build secure applications from the mindset of the hacker and avoid being exploited.

for_yanCommented:
This is the code for the complete program which does it;
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();
        }
}

Open in new window

169022-out.txt
169023-out.txt
169024-out.txt
169025-out.txt
169026-out.txt
169027-out.txt
0
for_yanCommented:
This is even simpler varian which does not depend on the size fo the file and can handle files of any size.

Output files are attached.

import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;

public class SplitFile1 {

       public SplitFile1() {
        try{

            String sep = System.getProperty("line.separator");

            BufferedReader br = new BufferedReader((new FileReader("169022.txt")));
            String curFile = null;
            FileWriter fw = null;

            String buff = "";

            while((buff=br.readLine()) != null){
                String [] items = buff.split("[\\s]+");
                if(items.length < 3)continue;
                String name = items[7];
                if(!name.equals(curFile)){

                    curFile = name;
                    if(fw != null)fw.close();
                    fw = new FileWriter(new File(curFile+ "_out1.txt"), true);
                    

                }
               if(fw != null) fw.write(buff + sep);


            }

            br.close();
            if(fw != null) fw.close();

        } catch(Exception ex){
            ex.printStackTrace();
        }




}

    public static void main(String[] args) {
        new SplitFile1();
    }


}

Open in new window

169022-out1.txt
169023-out1.txt
169024-out1.txt
169025-out1.txt
169026-out1.txt
169027-out1.txt
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Richard TeasdaleFinancial ControllerAuthor Commented:
Thank You Very Much!
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.