有什么办法可以找到两个日期之间的数据,这些日期以相同的字符串存在并存储到json对象中

时间:2019-06-06 16:39:18

标签: java string date datetime

我想在对象中获取日期之后的String数据

样本输入:
2019-06-06 13:01:53.263Z | abc | alfkdjas | alfjdlaksd | alkjdfs
2019-06-06 13:01:53.264Z | lkjsfadfi | sadofuoif
2019-04-01 16:47:25.327Z |错误7816

输出: [{“ date”:“ 2019-06-06 13:01:53.263Z”,“ data”:“ | abc | ldskjf”},{“ date”:“ 2019-06-06 13:01:53.264Z” ,“ data”:“ || lkjsfadfi”}]

意味着我要在第一个日期之后直到第二个日期到来的数据。

我试图在两个日期之间分隔数据。

public static String ReadData() {

         BufferedReader reader;
           try {

               reader = new BufferedReader(new FileReader(logfilename));
               String line = reader.readLine();
               JSONArray jason=new JSONArray();
               JSONObject jo=new JSONObject();
               int count=0;
               while (true) {

                   if(line != null) {
                       if(count>0) {

                       }
                       if(isValidDate(line.split("\\|")[0])) {
                           count++;
                           jo.put("date", line.split("\\|")[0]);
jo.put("data",line);
                       }

                       line = reader.readLine();
                   }else {
                       break;
                   }


               }
               reader.close();
           } catch (IOException e) {
               e.printStackTrace();
           }
           return ""; 
     }

此功能将我的日期与字符串分开...

public static boolean isValidDate(String inDate) {

 SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-DD HH:mm:ss.ms");           
     try {
            dateFormat.parse(inDate);

            } catch (ParseException pe) {
                return false;
            }
            return true;
       }

输入:
2019-06-06 13:01:53.263Z | abc | ldskjf
2019-06-06 13:01:53.264Z | lkjsfadfi

输出:

[{"date":"2019-06-06 13:01:53.263Z","data":"|abc| ldskjf "},{"date":"2019-06-06 13:01:53.264Z","data":"|lkjsfadfi"}]

我的日志文件很大,我想从该日志文件中将该日志文件转换为JSON数组。

3 个答案:

答案 0 :(得分:1)

改为使用子字符串

String res = "2019-06-06 13:01:53.263Z|abc|alfkdjas|alfjdlaksd|alkjdfs "
res0.substring(res0.indexOf('|'))  // 2019-06-06 13:01:53.263Z
res0.substring(0,res0.indexOf('|'))// |abc|alfkdjas|alfjdlaksd|alkjdfs 

答案 1 :(得分:1)

您似乎正在寻找类似以下的内容。

首先,您需要一种方法来从文件中读取每行(如果不是逐行,请告诉我。这是我从您的问题中了解的信息)

此方法将返回一个ArrayList,其中包含输入文件的每一行。

public ArrayList<String> readAllLines(String filename){
    //ArrayList to hold all the lines
    ArrayList<String> lines = null;

    //Get lines of text (Strings) as a stream
    try (Stream<String> stream = Files.lines(Paths.get(filename))){
        // convert stream to a List-type object
        lines = (ArrayList<String>)stream.collect(Collectors.toList());
    }
    catch (IOException ioe){
        System.out.println("\nCould not read lines of text from the file.\n" +
                "Reason: parameter \"" + ioe.getMessage() + "\"");
    }
    catch (SecurityException se){
        System.out.println("Could not read the file provided." +
                "Please check if you have permission to access it.");
    }
    return lines;
}

接下来,我们需要一种方法来确定String是否是日期,我们将使用您在自己的问题中发布的方法。

public boolean isValidDate(String inDate) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.ms");
    try {
        dateFormat.parse(inDate);
    }
    catch (ParseException pe) {
        return false;
    }
    return true;
}

然后,我们将使用一种方法将解析的每个String转换为JSONObject

public JSONObject convertToJsonObject(String line){
    //Convert String into an ArrayList, split by "|" delimiter
    ArrayList<String> dataParts = new ArrayList<>(Arrays.asList(line.split("\\|")));
    String date=null;
    JSONObject jsonObj = new JSONObject();

    //Get the date, wherever it might be in the String and remove it from the List
    for(int i=0; i<dataParts.size(); i++){
        if (isValidDate(dataParts.get(i))){
            date = dataParts.get(i);
            dataParts.remove(i);
            break;
        }
    }
    //Add the date with key "date"
    jsonObj.put("date", date);
    //Add the rest of the data, with key "data" (while preserving the order)
    jsonObj.put("data", String.join("|", dataParts));

    return jsonObj;
}

最后,我们需要将以上所有内容结合在一起并产生理想结果的方法。

public JSONArray extractData(String filename){
    JSONArray jsonArray = new JSONArray();
    ArrayList<String> lines = readAllLines(filename);

    //For each line of the original text file, add the JSONObject to the JSONArray
    for (String line : lines)
        jsonArray.add(convertToJson(line));

    return jsonArray;
}

main方法中的用法是:

public static void main(String[] a){
    MyClass myClass = new MyClass();
    JSONArray myArray = myClass.extractData("myTextFile.txt");
    System.out.println(myArray.toJSONString());
}

输出:

[{"date":"2019-06-06 13:01:53.263Z","data":"abc|alfkdjas|alfjdlaksd|alkjdfs"},{"date":"2019-06-06 13:01:53.263Z","data":"abc|al"}]

如果日期始终是每一行中的第一个出现,那么最好使用String.substring()方法来提取日期,就像@Luis Ramirez-Monterosa在他的回答中所展示的那样。

我的工作是假设日期可能在输入字符串的中间。

答案 2 :(得分:0)

使用您创建的isValid()方法提取日期没有任何意义。该方法将返回boolean类型的对象(对或错)。

通过稍微修改您的方法,您可以创建以下代码,该代码从您提供的String示例中提取日期,最后返回一个Date类型的对象:

public static Date extractDate(String inDate) {
    Date dt = null;
    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.ms");
    try {
        dt = dateFormat.parse(inDate);
    } 
    catch (ParseException pe) {
        pe.printStackTrace();
    }
    return dt;
}

用法:

Date myDate = extractDate("2019-06-0613:01:53.263Z|abc|alfkdjas|alfjdlaksd|alkjdfs");

输出:

  

2019年6月6日星期四13:03:03