# 按照设定的过滤条件，从数据中过滤出满足条件的微博数据，这里以地区设定为例
# 在实际使用时，需要按照具体情况修改过滤条件和程序。
# 根据省直辖市和地级市的设置，抽取出该地区的微博数据，导出该地区的微博数据与原始数据格式一致

# 微博数据文件的格式：
#  用户ID 地址 微博ID unix时间戳 月数 周数 微博文本

import os 
import datetime, time

# ===================== 参数设置 =====================

# 原始数据文件的路径
inpath = "../data/weibo2209-samples/"

# 抽取出来的数据文件保存的路径
outpath = "../data/dalian/"

# 是否设置省直辖市或者地级市，如果有设置的话，提供地名
HAS_PROVINCE = False
lProvinces = ['上海']

HAS_CITY = True
lCities = ['大连']

# 是否有起止时间段的设定
HAS_TIME = False
startTime = datetime.datetime(2010, 5, 1, 0, 0, 0)
endTime = datetime.datetime(2019, 8, 12, 0, 0, 0)


# 是否有包含关键词的设定
HAS_KEYWORDS = False
# 每条微博需要包含的关键词列表
kywrds = ['养老院', '老年公寓', '敬老院', '养老中心', '老人院', '护理院', 
           '养老院里', '疗养院', '养老公寓', '养护院', '老人公寓',
           '养老服务中心', '居家养老服务中心', '日间照料中心', 
           '社区居家养老服务中心', '社区养老服务中心', '老年服务中心', 
           '社区日间照料中心', '养老服务站', '居家养老中心', '居家养老服务站', 
           '老年人日间照料中心', '医养中心', '照料中心', '老年人服务中心',
           '颐养中心', '康养中心', '医养中心', '养护院', '养生公寓', '康养社区', 
           '颐养公寓', '养老服务中心', '护理院', '颐养中心', '颐养中心', 
           '疗养中心', '养老机构', '老人疗养公寓', '老年疗养中心', '疗养机构', '安老院'
         ]

# ===================== 参数设置 =====================

# 在文本中搜素是否存在提供的关键词
def hasKywrds(lcontent):
    for kywrd in kywrds:
        if(lcontent.find(kywrd) >= 0):
            return True
    return False


# 将缓存中的微博数据wbuf写入文件fname中
def saveWeibo(fname, wbuf):
    if(len(wbuf) <= 0):
        return
    
    with open(fname, 'a', encoding='utf-8') as outf:
        outf.write(wbuf)
        outf.flush()

    return

# 筛选出符合要求的微博并导出
def weiboExport(fname, fpath):
    buf_out = ''
    
    #从数据文件中读入，解析每行内容
    num_lines = 0
    
    outfile = outpath + fname
    
    with open(fpath, encoding='utf-8') as freader:
        for fline in freader:
            line_content = fline.rstrip('\r\n')
            seg = line_content.split('\t')
            if(len(seg) != 7):
                continue
            
            #处理位置信息
            mprovince = ''
            mcity = ''
            loc = seg[1]
            if loc.find(" ")<0:
                mprovince= loc.strip()
            else:
                locseg = loc.split(' ')
                mprovince = locseg[0].strip()
                mcity = locseg[1].strip()
            
            if((mprovince == '海外') or (mprovince == '其他') or (mprovince == 'noop')):
                continue
            
            #判断该条微博是否符合地点的设置
            if((HAS_PROVINCE and not (mprovince in lProvinces)) or (HAS_CITY and not (mcity in lCities))):
                continue
            
            # 如果有时间段限定，则只保留时间段内（包括起止时间点）的数据
            if(HAS_TIME):
                dtime = datetime.datetime.fromtimestamp(int(seg[3]))
                if((dtime < startTime) or (dtime > endTime)):
                    continue
            
            #判断该条微博是否包含指定的关键词
            if(HAS_KEYWORDS and (not hasKywrds(seg[6]))):
                continue
            
            buf_out += line_content + '\n'
            
            num_lines += 1
            
            if(num_lines >= 1000):
                print('.', end='')
                saveWeibo(outfile, buf_out)
                buf_out = ''
                num_lines = 0
                
    print()
    
    saveWeibo(outfile, buf_out)
    buf_out = ''

    return

# 对inpath目录中的每个文件进行筛选，导出符合筛选要求的数据
for f in os.listdir(inpath):
    st = time.time()
    infile = inpath + f 
    print(infile)
    weiboExport(f, infile)
           
    et = time.time()
    print(f,":",(et-st),"s")
    
    