/*
* Copyright 2012 Shared Learning Collaborative, LLC
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.slc.sli.sample.transform;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVStrategy;
public class CcsCsvReader {
private static Pattern commaAndSpaces = Pattern.compile("^[\\s,]*$");
private CSVParser csvParser;
private Map<String, String> currentRecord;
private String[] firstLine;
private String copyright;
private boolean containsCopyright;
private String fileLocation;
void setFileLocation(String fileLocation) throws IOException {
this.fileLocation = fileLocation;
}
void setContainsCopyright(boolean containsCopyright) {
this.containsCopyright = containsCopyright;
}
void load() throws IOException {
File file = new File(fileLocation);
file = removeEmptyLinesFromCsv(file);
if (containsCopyright) {
copyright = removeTrailingCharacters(tail(file), ',');
file = removeLastLine(file);
}
InputStreamReader isReader = new InputStreamReader(new FileInputStream(file), "UTF-8");
csvParser = new CSVParser(isReader, CSVStrategy.EXCEL_STRATEGY);
firstLine = csvParser.getLine();
getNextRecord();
}
void getNextRecord() throws IOException {
String[] line = csvParser.getLine();
if (line == null) {
currentRecord = null;
return;
}
Map<String, String> record = new HashMap<String, String>();
for (int i = 0; i < firstLine.length; i++) {
record.put(firstLine[i], line[i]);
}
currentRecord = record;
}
Map<String, String> getCurrentRecord() {
return currentRecord;
}
String getCopyright() {
return copyright;
}
private String tail(File file) {
try {
RandomAccessFile fileHandler = new RandomAccessFile(file, "r");
long fileLength = file.length() - 1;
long filePointer;
for (filePointer = fileLength; filePointer != -1; filePointer--) {
fileHandler.seek(filePointer);
int readByte = fileHandler.readByte();
if (readByte == 0xA) {
if (filePointer == fileLength) {
continue;
} else {
break;
}
} else if (readByte == 0xD) {
if (filePointer == fileLength - 1) {
continue;
} else {
break;
}
}
}
String lastLine=fileHandler.readLine();
fileHandler.close();
return lastLine.substring(1);
} catch (java.io.FileNotFoundException e) {
e.printStackTrace();
return null;
} catch (java.io.IOException e) {
e.printStackTrace();
return null;
}
}
private String removeTrailingCharacters(String s, char c) {
int lastNonCommaIndex = -1;
for (int i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) != c) {
lastNonCommaIndex = i;
break;
}
}
if (lastNonCommaIndex != -1) {
return s.substring(0, lastNonCommaIndex + 1);
}
return "";
}
private File removeLastLine(File fileIn) throws IOException {
File tempFile = File.createTempFile("temp", "txt");
tempFile.deleteOnExit();
BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
BufferedReader reader = new BufferedReader(new FileReader(fileIn));
String previousLine = reader.readLine();
if (previousLine != null) {
for (;;) {
String line = reader.readLine();
if (line == null) {
break;
} else {
writer.write(previousLine);
writer.write('\n');
previousLine = line;
}
}
}
reader.close();
writer.close();
return tempFile;
}
private File removeEmptyLinesFromCsv(File csvFileIn) throws IOException {
File tempFile = File.createTempFile("temp", "txt");
tempFile.deleteOnExit();
BufferedWriter writer = new BufferedWriter(new FileWriter(tempFile));
BufferedReader reader = new BufferedReader(new FileReader(csvFileIn));
for (;;) {
String line = reader.readLine();
if (line == null) {
break;
} else if ("".equals(line.trim())) {
continue;
} else if (!commaAndSpaces.matcher(line).matches()) {
writer.write(line);
writer.write('\n');
}
}
reader.close();
writer.close();
return tempFile;
}
}