在java中从txt文件中提取数据[已关闭]

but5z9lq  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(132)
    • 已关闭**。此问题需要超过focused。当前不接受答案。
    • 想要改进此问题吗?**更新此问题,使其仅关注editing this post的一个问题。

十小时前关门了。
Improve this question
i have a text file which contain data for a given month in days,like below. The data sequence can be different and other tags can also be there such as Unnecessary info. i need to extract some tags such as Date, "Min Temperatue", "Min Temperatue time", "Max Temperature", "Max Temperatue time", "Average Temperature". what approach to use ??您的文本'

> `Device: HAIER
Version: 23.2
Sensor: 1
Ext Sensor: 1
1:
Date: 2023-02-14
Unnecessary info : ignore
Min Temperature: +5.7, Min Temperature time: 00:15
Max Temperature: +6.1, Max Temperature time: 10:14
Average Temperature: +5.8
2:
Date: 2023-02-14
Min Temperature: +5.7, Min Temperature time: 00:15
Max Temperature: +6.1, Max Temperature time: 10:14
Unnecessary info : ignore
Average Temperature: +5.8
3:
Date: 2023-02-14
Min Temperatue: +5.7, Min Temperatue time: 00:15
Max Temperature: +6.1, Max Temperatue time: 10:14
Average Temperature: +5.8
4:
Date: 2023-02-14
Min Temperatue: +5.7, Min Temperatue time: 00:15
Max Temperature: +6.1, Max Temperatue time: 10:14
Average Temperature: +5.8`

我试过使用正则表达式,但正如我前面所说的序列可以不同,所以正则表达式有时会失败。我也试过使用ANTLR,但无法成功。

eqoofvh9

eqoofvh91#

在这里,我试图根据您的要求和希望给予解决方案,这个解决方案适合您。我试图在这里强调的一件事是,有一个单词的拼写错误***温度***&温度
下面的解决方案是基于RegEx的,我考虑了一个不匹配字的小错误。另外,我考虑了这里的序列可以不同。仍然,我假设这里必须存在所需的所有标记。

public static void main(String[] args) throws Exception {
    String filePath = ".... file name";
    String data = readFileAsString(filePath);
    List<String> dates = matchAll(data, "Date: (\\d{4}-\\d{2}-\\d{2})", 1);
    List<String> minTemp = matchAll(data, "Min Temperatur?e: (\\+\\d+\\.\\d+)", 1);
    List<String> minTempTime = matchAll(data, "Min Temperatur?e time: (\\d{2}:\\d{2})", 1);
    List<String> maxTemp = matchAll(data, "Max Temperatur?e: (\\+\\d+\\.\\d+)", 1);
    List<String> maxTempTime = matchAll(data, "Max Temperatur?e time: (\\d{2}:\\d{2})", 1);
    List<String> avgTemp = matchAll(data, "Average Temperatur?e: (\\+\\d+\\.\\d+)", 1);
    int totalDateRecords = dates.size();
    
    //Check, If Regex is properly work and collected records for all dates.
    if(totalDateRecords == minTemp.size() && totalDateRecords == minTempTime.size() 
            && totalDateRecords == maxTemp.size() && totalDateRecords == maxTempTime.size() 
            && totalDateRecords == avgTemp.size()) 
    {
        for(int i = 0; i < totalDateRecords; i++) {
            System.out.print("Date :"+dates.get(i));
            System.out.print(" MinTemp :"+minTemp.get(i));
            System.out.print(" MinTempTime :"+minTempTime.get(i));
            System.out.print(" MaxTemp :"+maxTemp.get(i));
            System.out.print(" MaxTempTime :"+maxTempTime.get(i));
            System.out.println(" AvgTemp :"+avgTemp.get(i));
        }
    }
    
}

public static List<String> matchAll(String inputText, String expression, int groupNum) {
    Matcher m = Pattern.compile(expression, Pattern.CASE_INSENSITIVE).matcher(inputText);
    List<String> list = new ArrayList<String>();
    while (m.find()) {
      list.add(m.group(groupNum).trim());
    }
    return list;
}
public static String readFileAsString(String fileName)throws Exception{
    return new String(Files.readAllBytes(Paths.get(fileName)));
}

此程序的输出如下所示:

Date :2023-02-14 MinTemp :+5.7 MinTempTime :00:15 MaxTemp :+6.1 MaxTempTime :10:14 AvgTemp :+5.8
Date :2023-02-14 MinTemp :+5.7 MinTempTime :00:15 MaxTemp :+6.1 MaxTempTime :10:14 AvgTemp :+5.8
Date :2023-02-14 MinTemp :+5.7 MinTempTime :00:15 MaxTemp :+6.1 MaxTempTime :10:14 AvgTemp :+5.8
Date :2023-02-14 MinTemp :+5.7 MinTempTime :00:15 MaxTemp :+6.1 MaxTempTime :10:14 AvgTemp :+5.8

相关问题