帮朋友写了个统计弹幕的java脚本
可实现功能:统计弹幕,统计弹幕关键词出现次数,统计礼物
文本例子:
2022-01-18 19:21:50 弹幕—— blue猪猪崽宝贝最棒啦:?
2022-01-18 19:21:50 弹幕—— 土狼京介:你这主玩什么英雄啊?
2022-01-18 19:21:51 弹幕—— 魔法攻撃:哈哈哈哈哈哈哈哈哈
2022-01-18 19:21:51 弹幕—— 春渡日和:?
2022-01-18 19:21:51 弹幕—— 钻石高中生1:我!
2022-01-18 19:21:51 礼物—— 你在外面有猫了吗:送出了1个520
2022-01-18 19:21:52 弹幕—— 阴不死你我就死:先跑为敬
2022-01-18 19:21:52 弹幕—— 可乐鸡翅蛋包饭:僵硬
2022-01-18 19:21:52 礼物—— 你在外面有猫了吗:送出了1个520
2022-01-18 19:21:52 礼物—— 是再见呢:送出了1个520
2022-01-18 19:21:52 礼物—— 是再见呢:送出了1个520
2022-01-18 19:21:52 礼物—— 是再见呢:送出了1个520
2022-01-18 19:21:52 礼物—— 是再见呢:送出了1个520
2022-01-18 19:21:52 弹幕—— 梦游1128:???????????
2022-01-18 19:21:52 弹幕—— 草莓啵啵奶绿:有点僵硬
2022-01-18 19:21:52 弹幕—— 西路伊浅:别上头啊主播
2022-01-18 19:21:52 弹幕—— 羊仔不咩:僵硬
2022-01-18 19:21:52 礼物—— 是再见呢:送出了1个520
2022-01-18 19:21:52 弹幕—— 鹤遥丶:?
2022-01-18 19:21:52 弹幕—— 绵十七:我在#消消乐#中闯到第3关,点击弹幕立即挑战〉〉
2022-01-18 19:21:53 弹幕—— 惧人心ii:别带闪现了求求了
2022-01-18 19:21:53 弹幕—— 白鹿踏月:?
2022-01-18 19:21:53 礼物—— 是再见呢:送出了1个519
2022-01-18 19:21:53 弹幕—— fatedmilk:?
2022-01-18 19:21:53 弹幕—— 是甜甜甜猪:??
2022-01-18 19:21:53 弹幕—— 用户554208371:?
2022-01-18 19:21:53 礼物—— 是再见呢:送出了1个519
2022-01-18 19:21:53 弹幕—— 呆妹儿的okdosk:僵硬
2022-01-18 19:21:53 礼物—— 顾星乐:送出了1个824
import jdk.nashorn.internal.runtime.OptimisticReturnFilters;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;
public class BulletChat {
public static void main(String[] args) {
// 按实际业务传入文件 TODO
openStream("C:/Users/ayueHcy/Desktop/BLUE5063899-2022-2-19.txt");
}
/**
* 统一开启数据流
* @param fileAddress
*/
public static void openStream(String fileAddress){
// 创建File类对象
File file = new File(fileAddress);
// 创建FileInputStream类对象读取File
FileInputStream fileInputStream = null;
// 创建InputStreamReader对象接收文件流
InputStreamReader inputStreamReader = null;
// 创建reader缓冲区将文件流装进去
BufferedReader bufferedReader = null;
// 按需求解析弹幕txt文件(过滤[礼物]以及['?'])
toAnalysisBulletChat(file,fileInputStream,inputStreamReader,bufferedReader);
}
/**
* 按需求解析弹幕txt文件(过滤[礼物]以及['?'])
* @param file
* @param fileInputStream
* @param inputStreamReader
* @param bufferedReader
* @return
*/
public static List<String> toAnalysisBulletChat(File file,
FileInputStream fileInputStream,
InputStreamReader inputStreamReader,
BufferedReader bufferedReader){
// 弹幕集合 例:你这主玩什么英雄啊?
List<String> bulletChatList = new ArrayList<>();
// 统计弹幕集合
Map<String,Integer> statisticsbulletChat=new HashMap<>();
// 礼物集合 例:送出了1个520
List<String> giftList = new ArrayList<>();
// 去重礼物用到的中间集合
List<String> tempGiftList = new ArrayList<>();
// 去重礼物集合 只存放送出的礼物去重
List<String> distinctGiftList = new ArrayList<>();
// 统计每种礼物各送出多少个
Map<String,Integer> statisticsGift=new HashMap<>();
try {
fileInputStream = new FileInputStream(file);
inputStreamReader = new InputStreamReader(fileInputStream);
bufferedReader = new BufferedReader(inputStreamReader);
String lineTxt = null;
// 从缓冲区中逐行读取代码,调用readLine()方法
while ((lineTxt = bufferedReader.readLine()) != null) {
// 过滤弹幕
bulletChatList = toFilterLineTxtBulletChat(lineTxt,bulletChatList);
// 过滤礼物
giftList = toFilterLineTxtGift(lineTxt,giftList);
// 礼物去重
distinctGiftList = toDistinctGiftList(lineTxt,tempGiftList,distinctGiftList);
}
statisticsGift = toStatisticsGift(giftList, distinctGiftList);
statisticsbulletChat = toStatisticsBulletChatMap(bulletChatList);
// 对应的方法按需要注释
System.out.println("弹幕集合bulletChatList共"+bulletChatList.size()+"条有效数据");
System.out.println("统计每种弹幕关键词statisticsbulletChat各出现多少次"+statisticsbulletChat);
System.out.println("礼物集合giftList共"+giftList.size()+"条有效数据");
System.out.println("礼物去重distinctGiftList共"+distinctGiftList.size()+"种");
System.out.println("统计每种礼物statisticsGift各送出多少个"+statisticsGift);
// 全部弹幕
// for (String s : bulletChatList) {
// System.out.println(s);
// }
// 全部弹幕统计
// Set<String> keySet = statisticsbulletChat.keySet();
// for (String key : keySet) {
// System.out.printf(key);
// System.out.println("出现了"+statisticsbulletChat.get(key)+"次");
// }
// 全部礼物统计
Set<String> keySet = statisticsGift.keySet();
for (String key : keySet) {
System.out.printf(key);
System.out.println("收到了"+statisticsGift.get(key)+"个");
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
// 关闭数据流
closeStream(fileInputStream, inputStreamReader, bufferedReader);
return bulletChatList;
}
/**
* 过滤弹幕
* @param lineTxt
* @param bulletChatList
* @return
*/
public static List<String> toFilterLineTxtBulletChat(String lineTxt,List<String> bulletChatList){
if (lineTxt.indexOf("弹幕—— ") > 1) {
// 过滤纯英文
if (!lineTxt.matches("[a-zA-Z]+")){
lineTxt = lineTxt.substring(25);
if (lineTxt.indexOf(":") > 1 || lineTxt.indexOf(":")>1) {
if (lineTxt.indexOf(":") > 1) {
lineTxt = lineTxt.substring(lineTxt.indexOf(":")+1);
// 过滤 '?'
if (lineTxt.indexOf("?") < 0 || lineTxt.lastIndexOf("?")<0) {
bulletChatList.add(lineTxt);
}
}
if (lineTxt.indexOf(":") > 1) {
lineTxt = lineTxt.substring(lineTxt.indexOf(":")+1);
// 过滤 '?'
if (lineTxt.indexOf("?") < 0 || lineTxt.lastIndexOf("?")<0) {
bulletChatList.add(lineTxt);
}
}
}
}
}
return bulletChatList;
}
/**
* 过滤礼物
* @param lineTxt
* @param giftList
* @return
*/
public static List<String> toFilterLineTxtGift(String lineTxt,List<String> giftList) {
if (lineTxt.indexOf("礼物—— ") > 1){
lineTxt = lineTxt.substring(25);
if (lineTxt.indexOf(":") > 1 || lineTxt.indexOf(":")>1) {
if (lineTxt.indexOf(":") > 1) {
lineTxt = lineTxt.substring(lineTxt.indexOf(":")+1);
giftList.add(lineTxt);
}
if (lineTxt.indexOf(":") > 1) {
lineTxt = lineTxt.substring(lineTxt.indexOf(":")+1);
giftList.add(lineTxt);
}
}
}
return giftList;
}
/**
* 礼物去重
* @param lineTxt
* @param tempGiftList
* @param distinctGiftList
* @return
*/
public static List<String> toDistinctGiftList(String lineTxt,List<String> tempGiftList,List<String> distinctGiftList) {
if (lineTxt.indexOf("礼物—— ") > 1){
lineTxt = lineTxt.substring(25);
if (lineTxt.indexOf(":") > 1 || lineTxt.indexOf(":")>1) {
if (lineTxt.indexOf(":") > 1) {
lineTxt = lineTxt.substring(lineTxt.indexOf(":")+1);
lineTxt = lineTxt.substring(lineTxt.indexOf("个")+1);
tempGiftList.add(lineTxt);
}
if (lineTxt.indexOf(":") > 1) {
lineTxt = lineTxt.substring(lineTxt.indexOf(":")+1);
lineTxt = lineTxt.substring(lineTxt.indexOf("个")+1);
tempGiftList.add(lineTxt);
}
}
distinctGiftList = tempGiftList.stream().distinct().collect(Collectors.toList());
}
return distinctGiftList;
}
/**
*统计每种礼物各送出多少个
* @param giftList
* @param distinctGiftList
* @return
*/
public static Map<String,Integer> toStatisticsGift(List<String> giftList,
List<String> distinctGiftList){
Map<String, Integer> map = new HashMap<>();
for (String distinctGift : distinctGiftList) {
int giftNum = 0;
for (String gift : giftList) {
if (gift.indexOf(distinctGift) > 1) {
giftNum+=Integer.parseInt(gift.substring(gift.indexOf("了")+1,gift.indexOf("个")));
}
}
map.put(distinctGift, giftNum);
}
return map;
}
public static Map<String,Integer> toStatisticsBulletChatMap(List<String> bulletChatList){
Map<String, Integer> map = new HashMap<>();
for (String bulletChat : bulletChatList) {
int bulletChatNum = 0;
for (String bulletChatTemp : bulletChatList) {
if (bulletChatTemp.indexOf(bulletChat)>1){
bulletChatNum++;
}
}
if (bulletChatNum>2){
map.put(bulletChat, bulletChatNum);
}
}
return map;
}
/**
* // 统一关闭数据流
* @param fileInputStream
* @param inputStreamReader
* @param bufferedReader
*/
public static void closeStream(FileInputStream fileInputStream,
InputStreamReader inputStreamReader,
BufferedReader bufferedReader){
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (inputStreamReader != null) {
try {
inputStreamReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行统计弹幕实例:
哈哈哈哈哈哈哈哈哈
我!
先跑为敬
僵硬
有点僵硬
别上头啊主播
僵硬
我在#消消乐#中闯到第3关,点击弹幕立即挑战〉〉
别带闪现了求求了
?
僵硬
可是秀啊
哈哈哈哈哈哈
然后输了
老子想笑
浅空一下
哈哈哈
然后输了
但是输了
太想杀了
但是输了
结果输了
技能全空
哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈
没有出现了18次
办卡出现了8次
再出现了9次
我是主播出现了9次
全队人头出现了5次
啊啊啊啊出现了3次
开龙出现了23次
无语了出现了5次
龙出现了50次
笑了出现了8次
哈哈哈哈哈哈哈哈哈哈哈哈出现了3次
纸嫁衣出现了4次
你真的出现了4次
和谁玩你画我猜出现了3次
打龙出现了5次
哥哥出现了9次
好的出现了15次
小学生出现了26次
我喜欢出现了6次
送了全队的人头出现了3次
搞笑的出现了5次
撞墙出现了5次
爱了爱了出现了3次
脏话出现了4次
不愧是你出现了5次
蟑螂出现了10次
姐妹们刚下载斗鱼,我要怎么才能有猪猪的牌子呀出现了10次
就这出现了5次
尬死出现了4次
装出现了4次
喜欢程咬金出现了5次
哈哈哈嗝出现了3次
哇出现了5次
人机出现了16次
演员出现了6次
难受出现了3次
来了出现了14次
有病出现了3次
丢人出现了59次
哈哈哈哈出现了94次
这出现了114次
简单出现了3次
滚出现了3次
主播出现了194次
哈哈哈哈哈哈哈哈出现了15次
僵硬出现了92次
菜出现了14次
可以出现了44次
0就是0出现了3次
李白出现了3次
该出现了49次
求求了出现了4次
啾咪出现了3次
哦出现了15次
笑死了出现了8次
big胆出现了3次
哈哈哈哈哈哈出现了68次
想啸出现了9次
哈哈哈哈哈哈哈出现了20次
太丢人了出现了5次
玩了出现了3次
毒妇出现了3次
确实出现了3次
!!!!!出现了3次
抽搐出现了3次
和谁出现了6次
运行统计礼物实例:
21743收到了1个
21904收到了10个
192收到了185个
193收到了119个
21627收到了1个
20417收到了1个
21865收到了1个
20611收到了1个
20930收到了3个
21818收到了210个
712收到了213个
519收到了28个
1757收到了1个
21633收到了4个
20422收到了3个
20542收到了10个
20003收到了2个
20002收到了8个
20661收到了8个
20000收到了98个
20461收到了17个
21735收到了10个
21634收到了4个
20006收到了24个
520收到了110个
21909收到了30个
824收到了41248个
可根据自行业务需要修改