【求助】日志提取问题,行数不固定,怎么提取

兽兽 2021-05-10 08:09:24
$: 0, e$: 50000 以及中括号这些内容都是 时有时无的,
中括号的内容,有时候有多行,有时候就1行,

所以不能按行来提取,或者每几行几行提取,

想取出User1 User2 e$: $:

然后存入list或map
该怎么提取,求大佬赐教



--- User1: 士大夫消费 --- -- Mon Nov 23 19:47:20 2020
--- User2: 士大夫 --- -- Mon Nov 23 19:47:20 2020
$: 0, e$: 50000 -- Mon Nov 23 19:47:20 2020
--- User1: 洞洞2 --- -- Sun May 09 15:08:10 2021
--- User2: 女战士 --- -- Sun May 09 15:08:10 2021
[id=58709530], dur=1, max_dur=1, gemhole=[0,0], addtion=[0], antimonster=[0], dec_dmg=[0], add_life=[0] -- Sun May 09 15:08:10 2021
[id=6473413], dur=1, max_dur=1, gemhole=[0,0], addtion=[0], antimonster=[0], dec_dmg=[0], add_life=[0] -- Sun May 09 15:08:10 2021
[id=6470717], dur=1, max_dur=1, gemhole=[0,0], addtion=[0], antimonster=[0], dec_dmg=[0], add_life=[0] -- Sun May 09 15:08:10 2021
[id=6534954], dur=1, max_dur=1, gemhole=[0,0], addtion=[0], antimonster=[0], dec_dmg=[0], add_life=[0] -- Sun May 09 15:08:10 2021
[id=6547606], dur=1, max_dur=1, gemhole=[0,0], addtion=[0], antimonster=[0], dec_dmg=[0], add_life=[0] -- Sun May 09 15:08:10 2021
--- User1: 洞洞2 --- -- Sun May 09 15:18:06 2021
--- User2: 李达康同志 --- -- Sun May 09 15:18:06 2021
[id=5200240], dur=10000, max_dur=10000, gemhole=[13,13], addtion=[0], antimonster=[0], dec_dmg=[1], add_life=[0] -- Sun May 09 15:18:06 2021
[id=1885128], dur=6640, max_dur=7099, gemhole=[13,13], addtion=[8], antimonster=[0], dec_dmg=[0], add_life=[0] -- Sun May 09 15:18:06 2021
[id=58226605], dur=1, max_dur=1, gemhole=[0,0], addtion=[0], antimonster=[0], dec_dmg=[0], add_life=[0] -- Sun May 09 15:18:06 2021
--- User1: 士大夫消费 --- -- Mon Nov 23 19:47:21 2020
--- User2: 士大夫 --- -- Mon Nov 23 19:47:21 2020
$: 0, e$: 50000 -- Mon Nov 23 19:47:20 2021
--- User1: 是佛山 --- -- Sun May 09 15:28:00 2021
[id=5083968], dur=6874, max_dur=7099, gemhole=[13,13], addtion=[8], antimonster=[0], dec_dmg=[3], add_life=[0] -- Sun May 09 15:28:00 2021
--- User2: 洞洞2 --- -- Sun May 09 15:28:00 2021
--- User1: 是佛山 --- -- Sun May 09 15:28:32 2021
--- User2: 洞洞2 --- -- Sun May 09 15:28:32 2021
...全文
1322 点赞 收藏 17
写回复
17 条回复
兽兽 05月14日
引用 16 楼 xxoo2007 的回复:
这个简单,正则强抓就好 User[0-9]*:.*?\n(\$:.*?e\$.*?\n)?
User1: 士大夫消费 --- -- Mon Nov 23 19:47:20 2020

User2: 士大夫 --- -- Mon Nov 23 19:47:20 2020
$: 0, e$: 50000 -- Mon Nov 23 19:47:20 2020

User1: 洞洞2 --- -- Sun May 09 15:08:10 2021

User2: 女战士 --- -- Sun May 09 15:08:10 2021

User1: 洞洞2 --- -- Sun May 09 15:18:06 2021

User2: 李达康同志 --- -- Sun May 09 15:18:06 2021

User1: 士大夫消费 --- -- Mon Nov 23 19:47:21 2020

User2: 士大夫 --- -- Mon Nov 23 19:47:21 2020
$: 0, e$: 50000 -- Mon Nov 23 19:47:20 2021

User1: 是佛山 --- -- Sun May 09 15:28:00 2021

User2: 洞洞2 --- -- Sun May 09 15:28:00 2021

User1: 是佛山 --- -- Sun May 09 15:28:32 2021
正则不是很靠谱吧。我试过了。 想把User1: 到下一个User1: 之间的数据提出来,组合成 另一个新行,没成功
回复 点赞
xxoo2007 05月14日
这个简单,正则强抓就好

User[0-9]*:.*?\n(\$:.*?e\$.*?\n)?


User1: 士大夫消费 --- -- Mon Nov 23 19:47:20 2020

User2: 士大夫 --- -- Mon Nov 23 19:47:20 2020
$: 0, e$: 50000 -- Mon Nov 23 19:47:20 2020

User1: 洞洞2 --- -- Sun May 09 15:08:10 2021

User2: 女战士 --- -- Sun May 09 15:08:10 2021

User1: 洞洞2 --- -- Sun May 09 15:18:06 2021

User2: 李达康同志 --- -- Sun May 09 15:18:06 2021

User1: 士大夫消费 --- -- Mon Nov 23 19:47:21 2020

User2: 士大夫 --- -- Mon Nov 23 19:47:21 2020
$: 0, e$: 50000 -- Mon Nov 23 19:47:20 2021

User1: 是佛山 --- -- Sun May 09 15:28:00 2021

User2: 洞洞2 --- -- Sun May 09 15:28:00 2021

User1: 是佛山 --- -- Sun May 09 15:28:32 2021


回复 点赞
冰思雨 05月13日
你的要求是将文件的数据提取到 List 里面,而 List 是要占内存的,提取的数据越多,占的内存就越大,大到一定程度,内存就爆掉了。 我们一般情况下,处理大文件,都是随着提取数据,紧接着就处理掉了,不会先全都提取出来,然后,在进行处理。 如果处理起来不太方便的话,也可以将提取出来的数据保存到数据库中,数据库的操作按说应该要方便的多。 或者,你也可以将提取的过程做个更改,提取一定数量的数据之后,新生成一个文件将其保存到文件中,这样的话,就会生成多个小文件,然后,你再逐个处理小文件即可。
回复 点赞
yuzhizhi 05月12日
不知规则情况下,6楼是一个快捷有效办法。
回复 点赞
兽兽 05月12日
引用 13 楼 冰思雨 的回复:

    public static List<String> getLines(File target, String[] keys) throws IOException {
        List<String> result = new ArrayList<>();
        try(BufferedReader reader = new BufferedReader(new FileReader(target))) {
            String line = null;
            for (int lineNumber = 1; (line=reader.readLine())!=null; lineNumber++) {
                for (String key : keys) {
                    if (line.contains(key)) {
                        result.add(line);
                        break;
                    }
                }
            }
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        final File target = new File("/path/to/file");
        final String[] keys = new String[]{"User1", "User2",  "e$:", "$:"};
        List<String> result = getLines(target, keys);
        // 注意,target 文件太大的话,会爆掉内存的。
    }
文件是不能大于内存吗。是读到内存里面处理的,是这个意思吗, 好的,非常感谢,
回复 点赞
冰思雨 05月12日

    public static List<String> getLines(File target, String[] keys) throws IOException {
        List<String> result = new ArrayList<>();
        try(BufferedReader reader = new BufferedReader(new FileReader(target))) {
            String line = null;
            for (int lineNumber = 1; (line=reader.readLine())!=null; lineNumber++) {
                for (String key : keys) {
                    if (line.contains(key)) {
                        result.add(line);
                        break;
                    }
                }
            }
        }
        return result;
    }

    public static void main(String[] args) throws IOException {
        final File target = new File("/path/to/file");
        final String[] keys = new String[]{"User1", "User2",  "e$:", "$:"};
        List<String> result = getLines(target, keys);
        // 注意,target 文件太大的话,会爆掉内存的。
    }
回复 点赞
兽兽 05月11日
引用 10 楼 KeepSayingNo 的回复:
最好将日志固定格式,至于不同的对象数据可能字段格式不同,可以用json替代
因为是日志第三方的,固定不了,只能自己这里想办法了,
回复 点赞
KeepSayingNo 05月11日
最好将日志固定格式,至于不同的对象数据可能字段格式不同,可以用json替代
回复 点赞
兽兽 05月11日
引用 6 楼 qq_39936465 的回复:
你可以先把文件拆分成几个文件,用几个线程分别提取。
好的,感谢大佬的建议 我尝试做看看,新手也不是很6. 不知道能不能成功
回复 点赞
兽兽 05月11日
引用 7 楼 HHeyJ 的回复:
先根据关键词导出到处响应的文件,再直接读关键词文件 eg: 上述测试日志内容 关键词导出子文件 再直接读子文件即可
大佬能上demo吗,我看不懂
回复 点赞
HHeyJ 05月11日
先根据关键词导出到处响应的文件,再直接读关键词文件 eg: 上述测试日志内容 关键词导出子文件 再直接读子文件即可
回复 点赞
qq_39936465 05月11日
你可以先把文件拆分成几个文件,用几个线程分别提取。
回复 点赞
qq_39936465 05月11日
引用 4 楼 兽兽 的回复:
那要是有1g 大小,也要一行行判断吗, 这太不科学了吧
你的日志是按行写,又没有固定规律,不按1行行来判断,你能保证正确性?
回复 点赞
兽兽 05月11日
那要是有1g 大小,也要一行行判断吗, 这太不科学了吧
回复 点赞
qq_39936465 05月11日
引用 2 楼 兽兽 的回复:
没规律的只能一行一行拿出来判断。先读取1行判断是否存在你需要的字符串,存在的存入list,不存在读取下一条。不然你想怎么办?
回复 点赞
兽兽 05月11日
回复 点赞
兽兽 05月10日
在线等
回复 点赞
发动态
发帖子
Web 开发
创建于2007-09-28

5.2w+

社区成员

34.1w+

社区内容

Java Web 开发
社区公告
暂无公告