gpt4 book ai didi

java - 仅当某个值出现两次时才从 CSV 中获取最新行

转载 作者:行者123 更新时间:2023-12-02 03:43:41 25 4
gpt4 key购买 nike

我正在 Mule 中处理一个 CSV 文件,该文件可能如下所示:

ID|LastUpdated
01|01/12/2016 09:00:00
01|01/12/2016 09:45:00
02|01/12/2016 09:00:00
02|01/12/2016 09:45:00
03|01/12/2016 09:00:00

我正在尝试找到一种方法,通过仅采用由 LastUpdated 列确定的最近一个值来去除所有重复出现的 ID 值。我正在尝试使用 DataWeave 来实现这一目标,但到目前为止还没有运气。我愿意将逻辑写入自定义 Java 类,但对如何做到这一点的了解也有限。

我想要的输出如下:

ID|LastUpdated
01|01/12/2016 09:45:00
02|01/12/2016 09:45:00
03|01/12/2016 09:00:00

任何帮助或指导将不胜感激。

编辑:值得注意的是,我预计入站文件会非常大(最多 000 行),因此我需要了解解决方案的性能

编辑:使用 DataWeave 的解决方案可以在 Mulesoft 论坛 here 上找到。 .

最佳答案

如果日期/时间总是排序到您的 CSV 中,就像您给出的示例中那样,您可以将所有 ID 的引用作为键保存到 Map 中,然后只需更新与 ids 相对应的值:

public static void main(String[] arg){
// I replace all the CSV reading by this list for the example
ArrayList<String> lines = new ArrayList<>();
lines.add("01|01/12/2016 09:00:00");
lines.add("01|01/12/2016 09:45:00");
lines.add("02|01/12/2016 09:00:00");
lines.add("02|01/12/2016 09:45:00");
lines.add("03|01/12/2016 09:00:00");
Iterator it = lines.iterator();

Map<String, String> lastLines = new HashMap<String, String>();
while (it.hasNext()) { // Iterator on the CVS lines here
String s = (String)it.next();
String id = s.substring(0, s.indexOf("|"));
String val = s.substring(s.indexOf("|") + 1 , s.length());
lastLines.put(id, val);
}
Iterator<String> keys = lastLines.keySet().iterator();
while (keys.hasNext()) {
String id = (String) keys.next();
System.out.println(id + "|" + lastLines.get(id));
}
}

此产品:

01|01/12/2016 09:45:00

02|01/12/2016 09:45:00

03|01/12/2016 09:00:00

如果 CSV 记录可以按任意顺序排列,那么您需要添加日期验证,以仅保留每个 ID 的最新日期。

private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");

public static void main(String... args) {
// I replace all the CSV reading by this list for the example
ArrayList<String> lines = new ArrayList<>();

lines.add("01|01/12/2016 09:45:00");
lines.add("01|01/12/2016 09:00:00");
lines.add("02|01/12/2016 09:00:00");
lines.add("02|01/12/2016 09:45:00");
lines.add("03|01/12/2016 09:00:00");
Iterator it = lines.iterator();

Map<String, String> lastLines = new HashMap<String, String>();
while (it.hasNext()) { // Iterator on the CVS lines here
String s = (String)it.next();
String id = s.substring(0, s.indexOf("|"));
String val = s.substring(s.indexOf("|") + 1 , s.length());
if(lastLines.containsKey(id)){
try{
Date storeDate = sdf.parse(lastLines.get(id));
Date readDate = sdf.parse(val);
if(readDate.getTime() > storeDate.getTime())
lastLines.put(id, val);
}catch(ParseException pe){
pe.printStackTrace();
}
}else{
lastLines.put(id, val);
}
}
Iterator<String> keys = lastLines.keySet().iterator();
while (keys.hasNext()) {
String id = (String) keys.next();
System.out.println(id + "|" + lastLines.get(id));
}

}

我不确定您当前使用的日期格式。您可能需要更改解析器的格式“dd/MM/yyyy hh:mm:ss”。可以找到相关文档here

关于java - 仅当某个值出现两次时才从 CSV 中获取最新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36551501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com