我有一个任务是读取文件(特别是excel表),并将其转换为JSON以进行API调用。
Excel数据:
MAIN_ID SUB_ID VALUE
1000 1000-A1 10
1000 1000-A2 15
1000 1000-A3 20 // MAX Value against MAIN_ID
1001 1001-A1 12
1001 1001-A2 14
1001 1001-A3 25 // MAX Value against MAIN_ID
我的要求:
修改:
我忘记在这里添加一个必需的逻辑,因为我正在创建JSON,我需要将Max VALUE设置为对MAIN_ID的VALUE。
即我需要创建一个JSON文件,如:
{
"data": [
{
"MAIN_ID": "1000",
"SUB_ID": "1000-A1",
"VALUE": "20"
},
{
"MAIN_ID": "1000",
"SUB_ID": "1000-A2",
"VALUE": "20"
},
{
"MAIN_ID": "1000",
"SUB_ID": "1000-A3",
"VALUE": "20"
},
{
"MAIN_ID": "1001",
"SUB_ID": "1001-A1",
"VALUE": "25"
},
{
"MAIN_ID": "1001",
"SUB_ID": "1001-A2",
"VALUE": "25"
},
{
"MAIN_ID": "1001",
"SUB_ID": "1001-A3",
"VALUE": "25"
}
]
}
答案 0 :(得分:0)
我认为您的Excel工作表并不复杂,因此可以存储为CSV格式。从那里,您可以解析CSV文件,然后将其写为JSON文件,许多库已经支持这两个任务。显然,您可以在此过程中实现任何所需的逻辑。
这是一个简单的代码:
public class Model {
@JsonProperty("MAIN_ID")
private String mainId;
@JsonProperty("SUB_ID")
private String subId;
@JsonProperty("VALUE")
private String value;
public String getMainId() { ... }
public String setMainId(String mainId) { ... }
// other getters and settters
}
public class JacksonProgram {
public static void main(String[] args) throws Exception {
File input = new File("/x/data.csv");
File output = new File("/x/data.json");
List<Model> data = readObjectsFromCsv(input);
applyRequiredLogic(data);
writeAsJson(data, output);
}
public static void applyRequiredLogic(List<Model> data) {
//... your logic here
}
public static List<Model> readObjectsFromCsv(File file) throws IOException {
CsvMapper csvMapper = new CsvMapper();
CsvSchema bootstrap = csvMapper.schemaFor(Model.class).withHeader();
CsvMapper csvMapper = new CsvMapper();
MappingIterator<Model> mappingIterator = csvMapper.reader(Model.class).with(bootstrap).readValues(file);
return mappingIterator.readAll();
}
public static void writeAsJson(List<Model> data, File file) throws IOException {
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(file, data);
}
}
上面的代码使用com.fasterxml.jackson.dataformat:jackson-dataformat-csv:2.+
和com.fasterxml.jackson.core:jackson-databind:2.+
作为依赖项,因此请在使用代码之前将这两者声明为maven或gradle依赖项。
答案 1 :(得分:0)
您可以像这样简单地将对象转换为toJson;
public String toJson(ArrayList<Object> objects){
String result="[";
for(int i=0;i<objects.getSize();i++){
result+="{";
result+="MAIN_ID:"+ objects.get(i).mainId+",";
result+="SUB_ID:"+ objects.get(i).subId+",";
result+="VALUE:"+ objects.get(i).value+",";
result+="}";
if(i<object.getSize()-1){
result+=",";
}
}
result+=']';
return result;
}
尝试Apache POI HSSF。以下是有关如何阅读Excel文件的示例:
try {
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(file));
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFRow row;
HSSFCell cell;
int rows; // No of rows
rows = sheet.getPhysicalNumberOfRows();
int cols = 0; // No of columns
int tmp = 0;
// This trick ensures that we get the data properly even if it doesn't start from first few rows
for(int i = 0; i < 10 || i < rows; i++) {
row = sheet.getRow(i);
if(row != null) {
tmp = sheet.getRow(i).getPhysicalNumberOfCells();
if(tmp > cols) cols = tmp;
}
}
for(int r = 0; r < rows; r++) {
row = sheet.getRow(r);
if(row != null) {
for(int c = 0; c < cols; c++) {
cell = row.getCell((short)c);
if(cell != null) {
// Your code here
}
}
}
}
} catch(Exception ioe) {
ioe.printStackTrace();
}
**编辑:**您可以根据MAIN_ID更新列表值字段 您可以在更新对象列表之后迭代列表并创建新列表mainIdAndValueList(MainId-Value)
答案 2 :(得分:0)
有一个非常强大且免费的数据清理工具,名为OpenRefine(以前称为Google Refine),可以用于此目的。它不是为此目的而做广告的,但它做得非常好。请注意,必须安装64位Java。
我建议您在使用数据之前先阅读其3个简短的视频教程。 OpenRefine不会破坏您的数据,因为它可以与本地计算机上的数据的内存副本一起使用;本教程可帮助您更好地理解和使用该工具。
准备就绪后,创建一个新项目。在创建项目时,将生成JSON。您可以通过选择“导出”然后选择“模板化”来查看将输出的JSON。将打开“模板导出”窗口,并在右侧面板中显示要导出的JSON。如果已经按照自己的喜好对其进行了格式化,只需单击“导出”按钮,就可以完成。如果没有,您可以通过调整左侧一个或多个面板中的设置来修改模板。
如果需要调整数据,请返回项目,进行必要的调整,然后返回“模板导出”窗口。
通过OpenRefine,您可以做很多事情来调整日期。如果您经常使用数据,这是一个很好的工具。您可以在openrefine.org上找到它。