所以我有一个类似以下内容的Whatsapp日志文件:(时间戳不准确)
[15.11.16, 16:13:29] Person A: Hello
[15.11.16, 16:13:45] Person B: This is
a multiline
message
[15.11.16, 16:14:12] Person A: Wow, so cool
我想将它们解析为如下所示的json格式:
{
"msg": [
{
"sender": "Person A",
"message": "Hello",
"time": 1479205511000,
"response": {
"sender": "Person B",
"message": "This is\na multiline\nmessage",
"time": 1479205536000
}
},
...
]
}
什么意思是,首先将消息分为三个部分:
发生的另一件事是响应事件,它选择一个主要人员(在这种情况下为“人员A”)。然后,它会浏览从顶部开始的每条消息,寻找该人的第一条消息(称为“主消息”)。如果找到一个,它将寻找另一个人的响应(下一条消息(称为“响应”))。如果下一封邮件再次来自主要人员,它将选择该邮件作为“主邮件”,然后查找下一封邮件。
示例:
Person A: Hi
Person B: Hi
Person A: This is cool
Person A: I am cool
Person B: Ah ok
在此示例中,我们将选择“人员A”作为主要人员。第一条消息是由我们的主要人员写的,因此它将成为我们的主要消息。下一封邮件来自其他人,因此将是我们的回复。
{
"sender":"Person A",
"message":"Hi",
"time":1479205511000,
"response":{
"sender":"Person B",
"message":"Hi",
"time":1479205536000
}
}
下一条消息再次来自我们的主要消息,因此我们将其作为主要消息。但是此后的消息不是其他人的不是,因此我们将跳过之前的消息。 之后的消息又是我们的对手发出的,因此将是我们的回复。
{
"sender":"Person A",
"message":"I am cool",
"time":1479205511000,
"response":{
"sender":"Person B",
"message":"Ah ok",
"time":1479205536000
}
}
我们现在有了这样的JSON:
{
"msg":[
{
"sender":"Person A",
"message":"Hi",
"time":1479205511000,
"response":{
"sender":"Person B",
"message":"Hi",
"time":1479205536000
}
},
{
"sender":"Person A",
"message":"I am cool",
"time":1479205511000,
"response":{
"sender":"Person B",
"message":"Ah ok",
"time":1479205536000
}
}
]
}
有几个问题:
您可能已经猜到我的标签了,我使用的语言是Java。
如果有任何疑问或不清楚的信息,请随时引起我的注意。
答案 0 :(得分:0)
我自己做了。首先,我创建了一个名为“消息”的类:
public class Message {
public String sender;
public String time;
public String message;
public String plainMessage;
public Message(String line) {
String[] array = line.split("]");
time = clean(array[0].replace("[", ""));
array = Main.removeElements(array, array[0]);
line = Main.join("]", array);
array = line.split(":");
sender = clean(array[0]);
array = Main.removeElements(array, array[0]);
line = Main.join(":", array);
plainMessage = line;
line = StringEscapeUtils.escapeJava(line);
line = escapeUmlaut(line);
message = StringEscapeUtils.escapeJson(line);
}
private String escapeUmlaut(String input) {
String output = input.replace("ü", "ue")
.replace("ö", "oe")
.replace("ä", "ae")
.replace("ß", "ss");
output = output.replace("Ü(?=[a-zäöüß ])", "Ue")
.replace("Ö(?=[a-zäöüß ])", "Oe")
.replace("Ä(?=[a-zäöüß ])", "Ae");
output = output.replace("Ü", "UE")
.replace("Ö", "OE")
.replace("Ä", "AE");
return output;
}
public static String clean(String what) {
char[] chars = what.toCharArray();
what = "";
char[] allowed = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890[](){}=?!\\§$%&/'#*+;,:.-_<>|".toCharArray();
for (char c : chars) {
for (char cc : allowed) {
if (cc == c) {
what += c;
}
}
}
return what;
}
}
此类具有解析消息的任务。
这是我们组合多行消息的方式:
ArrayList <String> parsed = new ArrayList <String> ();
for (int x = 0; x < size; x++) {
String line = list.get(x);
if (startsWith(line, '[')) {
parsed.add(line);
} else {
int lastn = parsed.size() - 1;
String last = parsed.get(lastn);
last += "\\n" + line;
parsed.set(lastn, last);
}
}
这是使用类的方式:
Message MainMessage = null;
String json = "";
boolean firstWrite = false;
final Pattern pattern = Pattern.compile("[a-zA-Z0-9]+", Pattern.MULTILINE);
for (int x = 0; x < size; x++) {
result = "";
progressBar.setValue(x);
String line = parsed.get(x);
if (config.debug) {
System.out.println(line);
}
Message message = new Message(line);
final Matcher matcher = pattern.matcher(message.plainMessage);
if (!matcher.find()) {
continue;
}
if (x == 0 && mainSender == null) {
mainSender = message.sender;
MainMessage = message;
continue;
}
if (mainSender.equals(message.sender)) {
MainMessage = message;
} else if (message.sender != mainSender && MainMessage != null) {
json = "\n{\"sender\": \"" + MainMessage.sender + "\", \"message\": \"" + MainMessage.message + "\", \"response\": ";
json += "{\"sender\": \"" + message.sender + "\", \"message\": \"" + message.message + "\"}}";
if (firstWrite) {
json = "," + json;
}
Files.write(Paths.get(
export), json.getBytes(), StandardOpenOption.APPEND);
json = "";
MainMessage = null;
firstWrite = true;
}
}