I have CSV file which has structure like this (separated by tabulators):
VariableName DateAdded ValueNumeric
VariableName DateAdded ValueNumeric
VariableName DateAdded ValueNumeric
Examples of lines in input data: VariableName DateAdded ValueNumeric
St.podatkovnih_blokov 1.12.2015 0:00:21 0,2000
St.podatkovnih_blokov 1.12.2015 0:01:15 0,2000
St.podatkovnih_blokov 1.12.2015 0:02:14 0,2000
.
.
.
St.podatkovnih_blokov 31.12.2015 10:08:02 0,2000
St.podatkovnih_blokov 31.12.2015 22:31:04 0,2000
NAD_krmilnika 1.12.2015 0:00:21 1310,2000
NAD_krmilnika 1.12.2015 0:01:15 1310,2000
... and I am changing it to form where there are all variables with same date in same line:
DateAdded,VariableName,VariableName,VariableName,VariableName,VariableName //this is header and below are values for variables in the header
DateAdded,ValueNumeric,ValueNumeric,ValueNumeric,ValueNumeric,ValueNumeric
DateAdded,ValueNumeric,ValueNumeric,ValueNumeric,ValueNumeric,ValueNumeric
So lines in output data look like this:
datum,St.podatkovnih_blokov,NAD_krmilnika,K5_en_hlajenja_MWh_last_month,K5_en_hlajenja_MWh_this_year,K5_en_hlajenja_MWh_last_year,Rezerva_1,Run_Counter,negative_active_energy_today,negative_active_energy_yesterday,negative_active_energy_this_week,negative_active_energy_last_week,negative_active_energy_this_mont,negative_active_energy_last_mont,negative_active_energy_this_year,negative_active_energy_last_year,strosek_danes_EUR,strosek_vceraj_EUR,K1_en_gretja_kWh_today,K1_en_gretja_kWh_yesterday,K1_en_gretja_MWh_this_month,K1_en_gretja_MWh_last_month,K1_en_gretja_MWh_this_year,K1_en_gretja_MWh_last_year,K1_en_hlajenja_MWh_this_year,K2_en_gretja_kWh_today,K2_en_gretja_kWh_yesterday,K2_en_gretja_MWh_this_month,K2_en_gretja_MWh_last_month,K2_en_gretja_MWh_this_year,K2_en_gretja_MWh_last_year,K2_en_hlajenja_kWh_today,K2_en_hlajenja_kWh_yesterday,K2_en_hlajenja_MWh_this_month,K2_en_hlajenja_MWh_last_month,K2_en_hlajenja_MWh_this_year,K2_en_hlajenja_MWh_last_year,K3_en_gretja_kWh_today,K3_en_gretja_kWh_yesterday,K3_en_gretja_MWh_this_month,K3_en_gretja_MWh_last_month,K3_en_gretja_MWh_this_year,K3_en_gretja_MWh_last_year,K3_en_hlajenja_kWh_today,K3_en_hlajenja_kWh_yesterday,K3_en_hlajenja_MWh_this_month,K3_en_hlajenja_MWh_last_month,K3_en_hlajenja_MWh_this_year,K3_en_hlajenja_MWh_last_year,K5_en_gretja_kWh_today,K5_en_gretja_kWh_yesterday,K5_en_gretja_MWh_this_month,K5_en_gretja_MWh_last_month,K5_en_gretja_MWh_this_year,K5_en_gretja_MWh_last_year,K5_en_hlajenja_kWh_today,K5_en_hlajenja_kWh_yesterday,K5_en_hlajenja_MWh_this_month,K235_en_gretja_kWh_today,K235_en_gretja_kWh_yesterday,K235_en_gretja_MWh_this_month,K235_en_gretja_MWh_last_month,K235_en_gretja_MWh_this_year,K235_en_gretja_MWh_last_year,K235_en_hlajenja_kWh_today,K235_en_hlajenja_kWh_yesterday,K235_en_hlajenja_MWh_this_month,K235_en_hlajenja_MWh_last_month,K235_en_hlajenja_MWh_this_year,K235_en_hlajenja_MWh_last_year,K235_trenutna_moc_kW,tekoce_24h_povprecje_Tzun,tekoce_48h_povprecje_Tzun,sprememba_1h_Tzun,sprememba_3h_Tzun,sprememba_6h_Tzun,sprememba_12h_Tzun,sprememba_24h_Tzun,T23,T51,T52,T
"1.12.2015 0:00:21","0,2000","1310,2000","-0,0200","-32,5900","0,0000","8,5000","2263,6000","0,7000","53,0000","53,0000","459,0000","0,0000","1185,0000","-31491,0000","18347,0000","0,0900","7,1500","0,0000","124,4000","0,0000","9,8100","184,6000","0,0000","-2,5500","0,0000","7,3000","0,0000","0,3600","2,7800","0,0000","0,0000","0,0000","0,0000","0,0000","-11,2800","0,0000","12,1000","307,0000","0,0100","8,8600","64,9400","0,0000","0,0000","-1,7000","0,0000","-0,0200","-40,8700","0,0000","3,5000","116,2000","0,0000","1,6300","6,4800","0,0000","0,0000","-0,4000","0,0000","15,6000","430,7000","0,0000","10,8000","74,2000","0,0000","0,0000","-2,2000","0,0000","0,0000","-84,7000","-84,7000","14,2000","8,4000","8,4000","-0,1000","0,0000","0,1000","999,0000","999,0000","22,2000","16,4000","16,5000"
"1.12.2015 0:01:15","0,2000","1310,2000","-0,0200","-32,5900","0,0000","8,5000","2682,6000","0,8000","53,0000","53,0000","459,0000","0,0000","1185,0000","-31491,0000","18347,0000","0,1000","7,1500","0,0000","124,4000","0,0000","9,8100","184,6000","0,0000","-2,5500","0,0000","7,3000","0,0000","0,3600","2,7800","0,0000","0,0000","0,0000","0,0000","0,0000","-11,2800","0,0000","12,3000","307,0000","0,0100","8,8600","64,9400","0,0000","0,0000","-1,7000","0,0000","-0,0200","-40,8700","0,0000","3,5000","116,2000","0,0000","1,6300","6,4800","0,0000","0,0000","-0,4000","0,0000","15,8000","430,7000","0,0000","10,8000","74,2000","0,0000","0,0000","-2,2000","0,0000","0,0000","-84,7000","-84,7000","13,7000","8,4000","8,4000","-0,1000","0,0000","0,1000","999,0000","999,0000","22,2000","16,4000","16,5000"
... Size of files that I use is more then 160mb. After manipulation is done, file size is a little bit more then 30mb.
When application is finished it also consumes around 180mb of memory (TaskManager). Could I reduce memory consumption any further? Here is the code of application:
static ArrayList<String> lines = new ArrayList();
static String outputFile = "MIC1deci_2015.csv";
static File importFile = new File("export.csv");
static Scanner scanner;
static StringBuilder lineBuilder = new StringBuilder();
static StringBuilder variableBuilder = new StringBuilder();
static int countStolpec = 0;
static int lineCount = 1;
static String variable = "";
static String oldVariable = "";
static int index = 0;
static int multi = 1;
static String value = "";
static String time = "";
static String date = "";
static boolean firstRead = true;
public static void main(String[] args) throws FileNotFoundException
{
readSettingsFile();
try
{
scanner = new Scanner(importFile); //Scnaer which reads out file
scanner.next();
scanner.next();
scanner.next();
oldVariable = scanner.next(); //in old variable we save, current variable that we are reading
variableBuilder.append("datum,").append(oldVariable);
lines.add(0,variableBuilder.toString());
try
{
while(scanner.hasNext())
{
if(firstRead)
{
buildFirstColumn(); //builds first column which contains date, until it reaches end of first variable
}
else
{
buildRestOfValues(); //adds variable values to appropriate date
}
}
}
catch(Exception ex)
{
System.out.println("ex in main loop: " + ex);
}
writeToOutputfile(); //when we have our data ready, we write it to export file, where values are seperated by ','
}
catch(IOException ex)
{
Logger.getLogger(ScadaParse.class.getName()).log(Level.SEVERE, null, ex);
}
}
static public void printLines()
{
int i = 0;
System.out.println("Printing lines");
for(String line : lines)
{
i++;
System.out.println("line " + i + ": " + line);
}
}
static public void writeToOutputfile() throws IOException
{
File file = new File(outputFile);
file.createNewFile();
try
{
FileWriter writer = new FileWriter(file);
System.out.print("Writing raw... ");
write(lines, writer);
} finally {
}
}
private static void write(List<String> records, Writer writer) throws IOException {
long start = System.currentTimeMillis();
for (String record: records) {
writer.write(record + "\n");
}
writer.flush();
writer.close();
long end = System.currentTimeMillis();
System.out.println((end - start) / 1000f + " seconds");
}
static void buildFirstColumn()
{
lineBuilder.append("\"").append(scanner.next()).append(" ").append(scanner.next()).append("\",\"").append(scanner.next()).append("\"");
lines.add(lineCount,lineBuilder.toString());
lineCount++;
lineBuilder.setLength(0);
variable = scanner.next();
if(!oldVariable.equals(variable))
{
System.out.println("old: " + oldVariable + " new:" + variable);
oldVariable = variable;
variableBuilder.append(",").append(variable);
lineCount = 1;
firstRead = false;
}
}
static void buildRestOfValues()
{
scanner.next();
scanner.next();
value = scanner.next();
lineBuilder.setLength(0);
try
{
String content = lines.get(lineCount);
lines.set(lineCount,lineBuilder.append(content).append(",\"").append(value).append("\"").toString());
}
catch(Exception ex)
{
System.out.println("index for lines to big: " + ex);
}
lineCount++;
variable = scanner.next();
if(!oldVariable.equals(variable))
{
System.out.println("old: " + oldVariable + " new:" + variable);
oldVariable = variable;
variableBuilder.append(",").append(variable);
lines.set(0,variableBuilder.toString());
lineCount = 1;
}
}