Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions src/main/java/com/epam/parso/SasFileReader.java
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,11 @@ public interface SasFileReader {
* @return the object of the {@link SasFileProperties} class that stores file metadata.
*/
SasFileProperties getSasFileProperties();

/**
* The function to return the index of the current row when reading the sas7bdat file.
*
* @return current row index
*/
Integer getOffset();
}
17 changes: 17 additions & 0 deletions src/main/java/com/epam/parso/impl/SasFileConstants.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@

package com.epam.parso.impl;

import java.awt.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Expand Down Expand Up @@ -1016,4 +1019,18 @@ public interface SasFileConstants {
*/
int START_DATES_SECONDS_DIFFERENCE = SECONDS_IN_MINUTE * MINUTES_IN_HOUR * HOURS_IN_DAY
* START_DATES_DAYS_DIFFERENCE;

java.util.List<String> DATE_TIME_FORMAT_STRINGS = (java.util.List<String>) Arrays.asList("DATETIME", "DATETIME7","DATETIME8",
"DATETIME9", "DATETIME10","DATETIME11","DATETIME12","DATETIME13","DATETIME14",
"DATETIME15","DATETIME16","DATETIME17","DATETIME18","DATETIME18.1","DATETIME19",
"DATETIME20.1","DATETIME21.2","DATETIME22.3",
"DATETIME.", "DATETIME7.","DATETIME8.",
"DATETIME9.", "DATETIME10.","DATETIME11.","DATETIME12.","DATETIME13.","DATETIME14.",
"DATETIME15.","DATETIME16.","DATETIME17.","DATETIME18.","DATETIME19."
);

java.util.List<String> DATE_FORMAT_STRINGS = (java.util.List<String>) Arrays.asList("DATE5", "DATE6","DATE7", "DATE8","DATE9","DATE11",
"DATE5.", "DATE6.","DATE7.", "DATE8.","DATE9.","DATE11.");

}

147 changes: 134 additions & 13 deletions src/main/java/com/epam/parso/impl/SasFileParser.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,13 +33,16 @@
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TimeZone;

import static com.epam.parso.impl.DateTimeConstants.DATETIME_FORMAT_STRINGS;
import static com.epam.parso.impl.DateTimeConstants.DATE_FORMAT_STRINGS;
Expand Down Expand Up @@ -571,7 +574,16 @@ public Object[] readNext(List<String> columnNames) throws IOException {
}
return Arrays.copyOf(currentRow, currentRow.length);
}


/**
* offset getter.
*
* @return current offset.
*/
Integer getOffset() {
return currentRowInFileIndex;
}

/**
* The method to read next page from sas7bdat file and put it into {@link SasFileParser#cachedPage}. If this page
* has {@link SasFileConstants#PAGE_META_TYPE_1} or {@link SasFileConstants#PAGE_META_TYPE_2} type method process
Expand Down Expand Up @@ -719,43 +731,152 @@ private Object[] processByteArrayWithData(long rowOffset, long rowLength, List<S
*/
private Object processElement(byte[] source, int offset, int currentColumnIndex) {
byte[] temp;
Object rowElements = "";
int length = columnsDataLength.get(currentColumnIndex);
if (columns.get(currentColumnIndex).getType() == Number.class) {
String format = columns.get(currentColumnIndex).getFormat().toString();
temp = Arrays.copyOfRange(source, offset + (int) (long) columnsDataOffset.get(currentColumnIndex),
offset + (int) (long) columnsDataOffset.get(currentColumnIndex) + length);
if (columnsDataLength.get(currentColumnIndex) <= 2) {
return bytesToShort(temp);
rowElements = bytesToShort(temp);
} else {
if (columns.get(currentColumnIndex).getFormat().getName().isEmpty()) {
return convertByteArrayToNumber(temp);
rowElements = convertByteArrayToNumber(temp);
} else {
if (DATETIME_FORMAT_STRINGS.containsKey(columns.get(currentColumnIndex).getFormat().getName())) {
return bytesToDateTime(temp);
if (SasFileConstants.DATE_TIME_FORMAT_STRINGS.contains(format)) {
String dateTime = convertSASDateTimetoString(format.toLowerCase(), temp,length);
rowElements = dateTime;
} else if(SasFileConstants.DATE_FORMAT_STRINGS.contains(format)) {
String date = convertSASDatetoString(format.toLowerCase(), temp);
rowElements = date;
} else {
if (DATE_FORMAT_STRINGS.containsKey(columns.get(currentColumnIndex).getFormat().getName())) {
return bytesToDate(temp);
} else {
return convertByteArrayToNumber(temp);
rowElements = convertByteArrayToNumber(temp);
}
}

}
}
} else {
byte[] bytes = trimBytesArray(source,
offset + columnsDataOffset.get(currentColumnIndex).intValue(), length);
if (byteOutput) {
return bytes;
rowElements = bytes;
} else {
try {
return (bytes == null ? null : bytesToString(bytes));
rowElements = (bytes == null ? null : bytesToString(bytes));
} catch (UnsupportedEncodingException e) {
LOGGER.error(e.getMessage(), e);
}
}
}
return null;
return rowElements;
}
private String convertSASDatetoString(String format, byte[] temp) {

SimpleDateFormat dateTime = dtFormat("ddMMMYYYY");
if ("date5".equals(format) ||"date5.".equals(format))
dateTime = dtFormat("ddMMM");
else if ("date6".equals(format) || "date6.".equals(format))
dateTime = dtFormat(" ddMMM");
else if ("date7".equals(format) || "date7.".equals(format))
dateTime = dtFormat("ddMMMYY");
else if ("date8".equals(format) || "date8.".equals(format))
dateTime = dtFormat(" ddMMMYY");
else if ("date9".equals(format) || "date9.".equals(format))
dateTime = dtFormat("ddMMMYYYY");
else if ("date11".equals(format) || "date11.".equals(format))
dateTime = dtFormat("dd-MMM-YYYY");

String formatted = "";
Date date = bytesToDate(temp);
if(date!=null) {
dateTime.setTimeZone(TimeZone.getTimeZone("UTC"));
formatted = dateTime.format(date);
}

return formatted.toUpperCase();
}

private String convertSASDateTimetoString(String format, byte[] temp, int length) {
SimpleDateFormat dateTime = dtFormat("ddMMMYY:HH:mm:ss");

if ("datetime7".equals(format) || "datetime7.".equals(format))
dateTime = dtFormat("ddMMMYY");

else if ("datetime8".equals(format) || "datetime8.".equals(format))
dateTime = dtFormat(" ddMMMYY");

else if ("datetime9".equals(format) || "datetime9.".equals(format))
dateTime = dtFormat(" ddMMMYY");

else if ("datetime10".equals(format) || "datetime10.".equals(format))
dateTime = dtFormat("ddMMMYY:HH");

else if ("datetime11".equals(format) || "datetime11.".equals(format))
dateTime = dtFormat(" ddMMMYY:HH");

else if ("datetime12".equals(format) || "datetime12.".equals(format))
dateTime = dtFormat(" ddMMMYY:HH");

else if ("datetime13".equals(format) || "datetime13.".equals(format))
dateTime = dtFormat("ddMMMYY:HH:mm");

else if ("datetime14".equals(format) || "datetime14.".equals(format))
dateTime = dtFormat(" ddMMMYY:HH:mm");

else if ("datetime15".equals(format) || "datetime15.".equals(format))
dateTime = dtFormat(" ddMMMYY:HH:mm");

else if ("datetime16".equals(format) || "datetime16.".equals(format))
dateTime = dtFormat("ddMMMYY:HH:mm:ss");

else if ("datetime17".equals(format) || "datetime17.".equals(format))
dateTime = dtFormat(" ddMMMYY:HH:mm:ss");

else if ("datetime18".equals(format) || "datetime18.".equals(format))
dateTime = dtFormat(" ddMMMYY:HH:mm:ss");

else if ("datetime18.1".equals(format))
dateTime = dtFormat("ddMMMYY:HH:mm:ss.SSS");

else if ("datetime19".equals(format) || "datetime19.".equals(format))
dateTime = dtFormat(" ddMMMYYYY:HH:mm:ss");

else if ("datetime20.1".equals(format))
dateTime = dtFormat("ddMMMYYYY:HH:mm:ss.SSS");

else if ("datetime21.2".equals(format))
dateTime = dtFormat("ddMMMYYYY:HH:mm:ss.SSS");

else if ("datetime22.3".equals(format)) {
dateTime = dtFormat("ddMMMYYYY:HH:mm:ss.SSS");
}


String formatted = "";
Date date = bytesToDateTime(temp);
if(date!=null) {
dateTime.setTimeZone(TimeZone.getTimeZone("UTC"));
formatted = dateTime.format(date);
if(format.contains(".")){
String decimals = format.substring(format.indexOf(".")+1,format.length());
if(decimals=="1") {
formatted = formatted.substring(0, formatted.length()-2);
}
if(decimals=="2") {
formatted = formatted.substring(0, formatted.length()-1);
}
}
}

return formatted.toUpperCase();
}

private SimpleDateFormat dtFormat(String format) {
SimpleDateFormat datetimeformat = new SimpleDateFormat(format);
return datetimeformat;
}


/**
* The function to read the list of bytes arrays from the sas7bdat file. The array of offsets and the array of
* lengths serve as input data that define the location and number of bytes the function must read.
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/com/epam/parso/impl/SasFileReaderImpl.java
Original file line number Diff line number Diff line change
Expand Up @@ -186,6 +186,15 @@ public Object[] readNext() throws IOException {
public Object[] readNext(List<String> columnNames) throws IOException {
return sasFileParser.readNext(columnNames);
}
/**
* The function to return the index of the current row when reading the file sas7bdat file.
*
* @return current row index
*/
@Override
public Integer getOffset() {
return sasFileParser.getOffset();
}

/**
* The function to get sas file properties.
Expand Down