首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Excel嗅探、正则表达式和子字符串匹配

Excel嗅探、正则表达式和子字符串匹配
EN

Stack Overflow用户
提问于 2018-09-03 02:16:20
回答 2查看 189关注 0票数 0

我有这段代码,它在目录中所有电子表格的“列”中搜索“短语”,然后将匹配的日期、时间和位置输出到"output.csv“中(该位置在同一行上,但日期和时间在同一行中,从”短语“行位置向上0-7行)。我需要它能够在单元格中找到“短语”,但现在,它只适用于精确匹配。如果列20中的单元格包含"phrase one",下面的示例不会将写入输出文件。

代码语言:javascript
复制
import os
import xlrd
from xlrd import open_workbook
import datetime
from datetime import time
import csv

# edit these params
outputfile = 'output.csv'
phrase = 'phrase'
column = 20

rootdir = '.'


def writeToCSV(datalist,outputfile):
    with open(outputfile, 'w') as f:
        for sublist in datalist:
            for item in sublist:
                f.write(item + ',')
            f.write('\n')

def getdata(filename,row):
    # print(row)
    # print(filename,'filename')
    wb = open_workbook(filename)
    items = []
    for sheet in wb.sheets():
        number_of_rows = sheet.nrows
        number_of_columns = sheet.ncols

        rows = []
        # print(filename,' file')
        for row1 in range(row,row-10, -1):
            # print()
            if row1 >= 0 and row1 < number_of_rows:
                rowNo = sheet.cell(row1, 2).value
                try :
                    if rowNo != '' and int(rowNo):
                        datetime1 = datetime.datetime(*xlrd.xldate_as_tuple(sheet.cell_value(rowx=row1, colx=0), wb.datemode))
                        date_values = xlrd.xldate_as_tuple(sheet.cell_value(rowx=row1, colx=1), wb.datemode)
                        time_value = time(*date_values[3:])
                        # print(time_value)
                        items.append(str(rowNo))
                        items.append(str(datetime1))
                        items.append(str(time_value))
                        # items[str(rowNo)]= str(datetime1)+'-'+str(time_value)
                        break
                except Exception as e:
                    pass
                    # print(e)
    # print(items)
    return items

def extractData(filename,searchString,column):
    wb = open_workbook(filename)
    dataList = []
    for sheet in wb.sheets():
        number_of_rows = sheet.nrows
        number_of_columns = sheet.ncols
        items = []
        rows = []
        for row in range(1, number_of_rows):
            rowdata = []
            for col in range(number_of_columns):
                value = (sheet.cell(row, col).value)
                if value == searchString :
                    if col == column :
                        data = getdata(filename,row)
                        dataList.append(data)

                        # print(value)
                # rowdata.append(value)

            # print(len(rowdata))
    return dataList

def main():
    for subdir, dirs, files in os.walk(rootdir):
        for file in files:
            fullname =os.path.join(subdir, file)
            list = subdir.split('\\')
            date = ''
            if len(list) > 2 :
                date = list[1].split('-')[1] +'-'+ list[2]
            # print(date)
            # print(file)
            if date != '' :
                namelist = file.split('-')
                if len(namelist)> 2:
                    if (namelist[0] in date) and (namelist[1] in date):
                        # print(file)
                        data = extractData(fullname,phrase,column)
                        if len(data) > 0 :
                            writeToCSV(data,outputfile)



if __name__ == '__main__':
    main()  # call main method

我知道regex可以很容易地找到字符串中的子字符串,但我不知道在代码中的确切位置进行修改。在不同的语言中,或者如果代码是以不同的方式编写的,我会尝试添加一个if语句,如果字符串包含" phrase ",则该语句会将数据写入输出文件,但我无法确定代码在何处尝试限定短语是否与单元格值匹配。任何关于这方面的见解都是值得赞赏的。

EN

回答 2

Stack Overflow用户

发布于 2018-09-03 02:32:47

在函数extractData中,将比较设置为if value == searchString :。这就是您检查字符串value (来自您的Excel文件)是否与searchString (您的"pharse")相同的地方。您可以将其替换为Pythons searchString in value。这行代码应该类似于if searchString in value:,如果只查找子字符串,则不需要正则表达式。

票数 1
EN

Stack Overflow用户

发布于 2018-09-03 07:45:21

有几件事似乎引起了问题,但最主要的原因可能是您的extractData模块在特定工作表的一行中找到了搜索字符串,并且getData模块在工作簿中的所有工作表中使用同一行,而没有验证是否每个工作表都向上移动到该行。最好是传递找到搜索字符串的工作表,然后让"getData“只搜索特定的工作表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52139859

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档