我想用java读取sas文件格式。但是在java中没有开放源码库可供使用。我还可以通过将xpt文件转换为CSV或sas7bdat格式来读取。但我无法做到这一点,请帮助我如何实现这一点。
发布于 2019-06-26 14:17:44
我在CodeProject上写了一段时间,解释了如何处理它:https://www.codeproject.com/Articles/492449/Transform-between-IEEE-IBM-or-VAX-floating-point
sas7bdat是不同的,但是xpt代码是可以下载的。
发布于 2022-09-09 08:32:36
这里的库可以解析Java中的xpt文件:
https://github.com/theshoeshiner/sas-utils
我自己测试过,对结果很满意。如果您使用Pandas将一个文件转换为JSON,那么这个库的结果应该是相同的。
现在,您需要克隆该项目并运行mvn install或类似的东西。然后,您需要在pom.xml或build.gradle文件中向项目添加依赖项,例如:
<dependency>
<groupId>org.thshsh</groupId>
<artifactId>sas-utils</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>我们用这个库构建了一个小的xpt到JSON转换器,这对我们来说很有用:
package com.onepointltd.sas.xpt;
import org.thshsh.sas.Variable;
import org.thshsh.sas.VariableType;
import org.thshsh.sas.xpt.DatasetXpt;
import org.thshsh.sas.xpt.LibraryXpt;
import org.thshsh.sas.xpt.ParserXpt;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* Converts the data in an xpt file to JSON array.
*/
public class JsonConversion {
private JsonConversion() {}
public static Collection<String> convertToJson(String xptFileStr) throws IOException {
File xptFile = new File(xptFileStr);
if(!xptFile.exists()) {
throw new FileNotFoundException(String.format("File %s does not exist", xptFileStr));
}
return convertToJson(xptFile);
}
public static Collection<String> convertToJson(File xptFile) throws IOException {
LibraryXpt library = ParserXpt.parseLibrary(xptFile);
List<DatasetXpt> datasets = library.getDatasets();
if(datasets == null || datasets.isEmpty()) {
return Collections.emptyList();
}
return datasets.stream().map(datasetXpt -> {
try {
return "[" + datasetXpt.streamObservations(xptFile).map(observation -> {
Map<Variable, Object> values = observation.getValues();
return "{" + values.entrySet().stream().map((entry) -> {
Variable key = entry.getKey();
Object value = entry.getValue();
VariableType type = key.getType();
if (type == VariableType.Character) {
value = value == null ? "" : quote(value.toString().trim());
}
String name = key.getName();
return String.format("%s: %s", quote(name), value);
}).collect(Collectors.joining(",")) + "}";
}).collect(Collectors.joining(",")) + "]";
} catch (IOException e) {
throw new RuntimeException(e);
}
}).collect(Collectors.toList());
}
public static String quote(String string) {
if (string == null || string.length() == 0) {
return "\"\"";
}
char c = 0;
int i;
int len = string.length();
StringBuilder sb = new StringBuilder(len + 4);
String t;
sb.append('"');
for (i = 0; i < len; i += 1) {
c = string.charAt(i);
switch (c) {
case '\\':
case '"':
sb.append('\\');
sb.append(c);
break;
case '/':
// if (b == '<') {
sb.append('\\');
// }
sb.append(c);
break;
case '\b':
sb.append("\\b");
break;
case '\t':
sb.append("\\t");
break;
case '\n':
sb.append("\\n");
break;
case '\f':
sb.append("\\f");
break;
case '\r':
sb.append("\\r");
break;
default:
if (c < ' ') {
t = "000" + Integer.toHexString(c);
sb.append("\\u" + t.substring(t.length() - 4));
} else {
sb.append(c);
}
}
}
sb.append('"');
return sb.toString();
}
}JSON引号代码是从StackOverflow上的其他帖子中复制的
https://stackoverflow.com/questions/56772045
复制相似问题