我想在对象中获取日期之后的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数组。
答案 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