Right, so, I talked in my last entry how the wonders of regular expressions had saved my life, and therefore filled the world with utter joy. Once again a few days later I find myself faced with a similar problem, and you guessed it, regular expressions saved my life AGAIN.
The problem is essentially the same as before only this time I had a medium-sized database dump as a CSV file and once again I wanted to fill a Java array with the values from certain columns. For the record, as previously, this stuff was all for some JUnit tests I was running. A simplified example of what I was doing is shown below:
1 2 3 4 5 | while(itor.hasNext()) { Student student = itor.next(); assertTrue("Student " + student.getId() + " != " + idResults_[count], student.getId() == idResults_[count]); } |
Basically I have a list of Student
s that I have created whose ids I want to ensure correspond to what I expect them to be. To test this I have a data set of around 250 students (I’m not really that interested in checking the ids, it more a category a student is in but the ids example was easier to show).
In the code above idResults_ corresponds to an int array that I would like to generate from a column in the CSV file. So idResults_ looks something like:
int [] idResults_ = {87868,78757,89987,......}; |
So how did I generate this array? Well I extended the 5 lines in my last post into a slightly larger Perl script that takes some options and spits out the array initaliser. The actual script can be found HERE. The usage for this script is:
Usage: extract.pl -f <input_file> -c <id> -[hnwisro] -h Show this screen -n Show the column names in the file -w Separate on whitespace (default is a comma) -i Don't ignore first line, i.e. it contains the names of the columns -s Treat the data as a string, i.e. data in generated array is in double quotes, defaults to an int array -r Treat the data as characters, i.e. data in generated array is in quotes -f <input_file> Input file -c <id> column to include in array (can be either a number, zero based, or column name) -o <output_file> File array is output to (any other content will be over-written) Outputs a Java/C# array initaliser with values from column <id> from file <input_file> and send it out to <output_file> |
As you can see I have extended this somewhat from my previous post into a full blow utility (useful probably only to me, but hey who cares). As you can see, instead of creating an int array from the data if you use the -s
flag you can create a string array (e.g. {"Harry","Sally", "Billy"}
) or a character array using the -r
option. Furthermore, you can specify the column to create the array from. This can either be a zero based integer or the id of the column – this presumes that the first line in your file contains that names of the columns (ala CSV file). Also if the first line contains actual data, and you do not want it to be treated as the column names, then you can specify the -i
option to choose NOT to ignore the values contained on this line.
Well that’s it. Hope someone else finds the script useful. Over and out.