当前位置:首页>python>第169讲:智能客户信息清洗工具——Python与VBA数据清洗实战

第169讲:智能客户信息清洗工具——Python与VBA数据清洗实战

  • 2026-02-08 12:22:09
第169讲:智能客户信息清洗工具——Python与VBA数据清洗实战

在日常工作中,我们经常收到来自各部门的客户信息表,数据杂乱无章格式不一。本文将介绍如何用Python和VBA构建智能清洗工具,解决数据去重、地址拆分、电话格式标准化和邮箱验证等常见问题。

一、客户数据清洗的业务价值

客户数据是现代企业最宝贵的资产之一,但数据质量直接影响业务效果。据统计,企业因数据质量问题导致的营销资源浪费高达20%-30%,而高质量的客户数据能提升营销响应率35% 以上。

常见的客户数据问题包括:

  • 重复记录:同一客户多次录入,导致资源浪费

  • 地址混乱:省市区未拆分,影响区域分析

  • 电话格式不一:座机手机混合,难以统一联系

  • 邮箱无效:发件退信率高,影响沟通效率

二、Python方案:pandas数据清洗实战

Python的pandas库是数据清洗的利器,下面我们逐步实现完整的清洗流程。

2.1 数据读取与初步探索

import pandas as pdimport numpy as npimport refrom typing import DictListTupleimport loggingclass CustomerDataCleaner:    """客户数据清洗器"""    def __init__(self, file_path: str):        self.file_path = file_path        self.df_raw = None        self.df_clean = None        self.cleaning_report = {}        self.setup_logging()    def setup_logging(self):        """设置日志系统"""        logging.basicConfig(level=logging.INFO,                           format='%(asctime)s - %(levelname)s - %(message)s')        self.logger = logging.getLogger(__name__)    def load_data(self) -> pd.DataFrame:        """加载客户数据"""        try:            if self.file_path.endswith('.xlsx'):                self.df_raw = pd.read_excel(self.file_path, engine='openpyxl')            elif self.file_path.endswith('.csv'):                self.df_raw = pd.read_csv(self.file_path, encoding='utf-8')            self.logger.info(f"成功加载数据,共{len(self.df_raw)}行记录")            return self.df_raw        except Exception as e:            self.logger.error(f"数据加载失败: {str(e)}")            raise    def explore_data(self) -> Dict:        """数据探索与质量评估"""        if self.df_raw is None:            self.load_data()        exploration_report = {            'total_records'len(self.df_raw),            'columns'list(self.df_raw.columns),            'missing_values'self.df_raw.isnull().sum().to_dict(),            'duplicate_records'self.df_raw.duplicated().sum(),            'data_types'self.df_raw.dtypes.to_dict()        }        self.logger.info("数据探索完成")        return exploration_report

2.2 核心清洗功能实现

def remove_duplicates(self, subset_columns: List[str]) -> pd.DataFrame:    """基于关键字段去重"""    initial_count = len(self.df_raw)    # 多策略去重    self.df_clean = self.df_raw.drop_duplicates(subset=subset_columns, keep='first')    # 相似度去重(用于名称近似的情况)    self.df_clean = self._fuzzy_deduplicate(self.df_clean, 'customer_name')    removed_count = initial_count - len(self.df_clean)    self.cleaning_report['duplicates_removed'] = removed_count    self.logger.info(f"去重完成,移除{removed_count}条重复记录")    return self.df_cleandef _fuzzy_deduplicate(self, df: pd.DataFrame, column: str) -> pd.DataFrame:    """模糊去重(处理名称近似情况)"""    from difflib import SequenceMatcher    def similarity(a, b):        return SequenceMatcher(None, a, b).ratio()    # 简单的相似度去重逻辑    indices_to_remove = []    for i in range(len(df)):        if i in indices_to_remove:            continue        for j in range(i+1len(df)):            if similarity(str(df.iloc[i][column]), str(df.iloc[j][column])) > 0.8:                indices_to_remove.append(j)    return df.drop(df.index[indices_to_remove])def split_address_column(self, address_column: str                        output_columns: List[str] = ['province''city''district']) -> pd.DataFrame:    """拆分地址字段"""    if self.df_clean is None:        self.df_clean = self.df_raw.copy()    def address_splitter(address):        """智能地址拆分"""        if pd.isna(address) or address == '':            return [NoneNoneNone]        # 简单的地址拆分逻辑(实际项目可使用专业地址库)        address_str = str(address)        # 匹配省市区模式        province_pattern = r'([^省]+省)?([^市]+市)?([^区]+区)?'        match = re.match(province_pattern, address_str)        if match:            province = match.group(1or ''            city = match.group(2or ''            district = match.group(3or ''            return [province, city, district]        return [NoneNoneNone]    # 应用地址拆分    split_results = self.df_clean[address_column].apply(        lambda x: pd.Series(address_splitter(x), index=output_columns)    )    self.df_clean = pd.concat([self.df_clean, split_results], axis=1)    self.logger.info("地址字段拆分完成")    return self.df_clean

2.3 电话邮箱格式化与验证

def standardize_phone_format(self, phone_column: str) -> pd.DataFrame:    """统一电话格式"""    def phone_formatter(phone):        if pd.isna(phone):            return None        phone_str = str(phone)        # 移除非数字字符        cleaned = re.sub(r'\D''', phone_str)        # 手机号处理        if len(cleaned) == 11 and cleaned.startswith(('13''14''15''16''17''18''19')):            return f"{cleaned[:3]}-{cleaned[3:7]}-{cleaned[7:]}"        # 座机号处理        elif len(cleaned) == 12 and cleaned.startswith('0'):            return f"{cleaned[:4]}-{cleaned[4:8]}-{cleaned[8:]}"        elif len(cleaned) == 10 and cleaned.startswith('0'):            return f"{cleaned[:3]}-{cleaned[3:7]}-{cleaned[7:]}"        else:            return None  # 无效号码    self.df_clean[f'{phone_column}_standardized'] = self.df_clean[phone_column].apply(phone_formatter)    valid_phones = self.df_clean[f'{phone_column}_standardized'].notna().sum()    self.cleaning_report['valid_phones'] = valid_phones    self.cleaning_report['invalid_phones'] = len(self.df_clean) - valid_phones    self.logger.info("电话格式标准化完成")    return self.df_cleandef validate_email_addresses(self, email_column: str) -> pd.DataFrame:    """验证邮箱有效性"""    def email_validator(email):        if pd.isna(email):            return False'缺失'        email_str = str(email).lower().strip()        pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'        if not re.match(pattern, email_str):            return False'格式错误'        # 检查常见无效邮箱        invalid_domains = ['example.com''test.com''temp.com']        if any(domain in email_str for domain in invalid_domains):            return False'无效域名'        return True'有效'    validation_results = self.df_clean[email_column].apply(        lambda x: pd.Series(email_validator(x), index=['email_valid''email_status'])    )    self.df_clean = pd.concat([self.df_clean, validation_results], axis=1)    valid_count = self.df_clean['email_valid'].sum()    self.cleaning_report['valid_emails'] = valid_count    self.cleaning_report['invalid_emails'] = len(self.df_clean) - valid_count    self.logger.info("邮箱验证完成")    return self.df_clean

2.4 生成清洗报告

def generate_cleaning_report(self) -> Dict:    """生成详细清洗报告"""    if self.df_clean is None:        self.logger.error("请先执行数据清洗")        return {}    report = {        '清洗时间': pd.Timestamp.now().strftime('%Y-%m-%d %H:%M:%S'),        '原始记录数'len(self.df_raw),        '清洗后记录数'len(self.df_clean),        '记录减少率'f"{((len(self.df_raw) - len(self.df_clean)) / len(self.df_raw) * 100):.2f}%",        '数据质量评分'self._calculate_data_quality_score(),        '各字段完整性'self._calculate_field_completeness(),        '清洗详情'self.cleaning_report    }    self.logger.info("清洗报告生成完成")    return reportdef save_clean_data(self, output_path: str):    """保存清洗后的数据"""    if self.df_clean is None:        self.logger.error("没有可保存的清洗数据")        return    try:        with pd.ExcelWriter(output_path, engine='openpyxl'as writer:            self.df_clean.to_excel(writer, sheet_name='清洗后数据', index=False)            # 添加报告工作表            report_df = pd.DataFrame([self.generate_cleaning_report()]).T            report_df.columns = ['清洗报告']            report_df.to_excel(writer, sheet_name='清洗报告')        self.logger.info(f"清洗数据已保存至: {output_path}")    except Exception as e:        self.logger.error(f"数据保存失败: {str(e)}")

三、VBA方案:Excel原生清洗工具

对于习惯使用Excel的用户,VBA提供了原生支持的清洗方案。

3.1 基础VBA清洗框架

Sub CustomerDataCleaner()    Dim wsRaw As Worksheet, wsClean As Worksheet    Dim lastRow As Long, i As Long    Dim dict As Object    Dim cleanedCount As Long    ' 设置工作表    Set wsRaw = ThisWorkbook.Sheets("原始数据")    Set wsClean = ThisWorkbook.Sheets("清洗后数据")    ' 清空目标表    wsClean.Cells.Clear    wsClean.Range("A1").Value = "清洗开始时间: " & Now    ' 创建字典用于去重    Set dict = CreateObject("Scripting.Dictionary")    lastRow = wsRaw.Cells(wsRaw.Rows.Count, "A").End(xlUp).Row    cleanedCount = 0    ' 遍历处理每条记录    For i = 2 To lastRow        Dim customerKey As String        customerKey = wsRaw.Cells(i, 1).Value & "|" & wsRaw.Cells(i, 2).Value ' 姓名+电话作为唯一标识        If Not dict.Exists(customerKey) Then            dict.Add customerKey, True            cleanedCount = cleanedCount + 1            Call ProcessSingleRecord(wsRaw, wsClean, i, cleanedCount)        End If    Next i    ' 生成报告    Call GenerateVBAReport(wsClean, cleanedCount, lastRow - 1)    MsgBox "数据清洗完成!共处理 " & cleanedCount & " 条唯一记录"End Sub

3.2 单条记录处理函数

Sub ProcessSingleRecord(wsRaw As Worksheet, wsClean As Worksheet, sourceRow As Long, targetRow As Long)    ' 处理单条客户记录    Dim phone As String, email As String, address As String    ' 获取原始数据    phone = CStr(wsRaw.Cells(sourceRow, 3).Value)    email = CStr(wsRaw.Cells(sourceRow, 4).Value)    address = CStr(wsRaw.Cells(sourceRow, 5).Value)    ' 数据清洗    Dim cleanPhone As String    cleanPhone = StandardizePhone(phone)    Dim cleanEmail As String    cleanEmail = ValidateEmail(email)    ' 地址拆分    Dim province As String, city As String, district As String    Call SplitAddress(address, province, city, district)    ' 写入清洗后数据    wsClean.Cells(targetRow, 1).Value = wsRaw.Cells(sourceRow, 1).Value ' 姓名    wsClean.Cells(targetRow, 2).Value = wsRaw.Cells(sourceRow, 2).Value ' 原电话    wsClean.Cells(targetRow, 3).Value = cleanPhone    wsClean.Cells(targetRow, 4).Value = cleanEmail    wsClean.Cells(targetRow, 5).Value = province    wsClean.Cells(targetRow, 6).Value = city    wsClean.Cells(targetRow, 7).Value = districtEnd SubFunction StandardizePhone(rawPhone As String) As String    ' 标准化电话格式    Dim cleanPhone As String    cleanPhone = Replace(rawPhone, " """)    cleanPhone = Replace(cleanPhone, "-""")    cleanPhone = Replace(cleanPhone, "(""")    cleanPhone = Replace(cleanPhone, ")""")    ' 格式判断    If Len(cleanPhone) = 11 And Left(cleanPhone, 1) = "1" Then        StandardizePhone = Left(cleanPhone, 3) & "-" & Mid(cleanPhone, 4, 4) & "-" & Right(cleanPhone, 4)    ElseIf Len(cleanPhone) = 12 And Left(cleanPhone, 1) = "0" Then        StandardizePhone = Left(cleanPhone, 4) & "-" & Mid(cleanPhone, 5, 4) & "-" & Right(cleanPhone, 4)    Else        StandardizePhone = "无效号码"    End IfEnd Function

四、方案对比与选择指南

4.1 技术特性对比

特性维度

Python方案

VBA方案

优势分析

处理速度

⭐⭐⭐⭐(快速)

⭐⭐(较慢)

Python处理大数据更快

功能强大性

⭐⭐⭐⭐(丰富)

⭐⭐⭐(中等)

Python生态更完善

学习曲线

⭐⭐⭐(中等)

⭐⭐⭐⭐(简单)

VBA上手更快

跨平台性

⭐⭐⭐⭐(全平台)

⭐(仅Windows)

Python更具灵活性

扩展性

⭐⭐⭐⭐(强大)

⭐⭐(有限)

Python可扩展性更强

维护成本

⭐⭐⭐(较低)

⭐⭐(较高)

Python更易维护

4.2 实际应用场景选择

选择Python方案当

  • 数据量较大(超过1万条记录)

  • 需要复杂清洗逻辑(如模糊匹配、机器学习去重)

  • 跨平台部署需求

  • 需要集成到数据流水线中

选择VBA方案当

  • 数据量较小(几百至几千条)

  • 快速原型开发

  • 用户熟悉Excel环境

  • 一次性清洗任务

五、实战案例:电商客户数据清洗

5.1 业务背景

某电商平台需要清洗10万+条客户数据,用于后续的精准营销。原始数据包含重复注册地址格式混乱电话无效等问题。

5.2 Python完整解决方案

def ecommerce_customer_cleaning():    """电商客户数据清洗完整流程"""    # 初始化清洗器    cleaner = CustomerDataCleaner('ecommerce_customers.xlsx')    # 加载数据    raw_data = cleaner.load_data()    # 数据探索    exploration = cleaner.explore_data()    print("数据探索结果:", exploration)    # 执行清洗流程    cleaner.remove_duplicates(['customer_name''phone'])    cleaner.standardize_phone_format('phone')    cleaner.validate_email_addresses('email')    cleaner.split_address_column('address')    # 生成报告并保存    report = cleaner.generate_cleaning_report()    cleaner.save_clean_data('cleaned_ecommerce_customers.xlsx')    return cleaner# 执行清洗if __name__ == "__main__":    cleaner = ecommerce_customer_cleaning()    print("清洗完成!质量评分:", cleaner.cleaning_report.get('data_quality_score''N/A'))

测试题

  1. 在Python数据清洗中,处理大规模数据集(100万+记录)时,应该采用哪些内存优化策略?

  2. VBA的字典去重方法有什么局限性?在什么情况下可能无法准确识别重复记录?

  3. 设计一个多层次的地址识别算法,能够准确拆分包含特殊表述(如"北京市朝阳区北京CBD")的复杂地址。

  4. 如何实现增量数据清洗,即只清洗新增或修改的记录,而不需要重新处理整个数据集?

  5. 在客户数据清洗中,除了技术方案,还需要考虑哪些数据合规性和隐私保护问题?


答案

  1. Python内存优化策略:使用分块处理(chunksize参数)、指定数据类型(dtype参数)、使用稀疏数据结构及时释放不用的变量使用生成器而非列表。

  2. VBA字典去重局限性:基于精确匹配,无法处理拼写差异格式变化键长度限制无法处理复杂业务规则(如同一客户不同联系方式的合并)。

  3. 多层次地址识别算法:结合规则匹配(正则表达式)、地址库查询(行政区划库)、机器学习模型(序列标注)、上下文分析的多层次方法。

  4. 增量清洗实现:通过时间戳字段识别新增/修改记录、MD5哈希比较数据变化、建立数据版本控制设置增量处理窗口

  5. 数据合规性考虑个人信息保护法合规、数据加密存储访问权限控制数据脱敏处理清洗日志审计


希望这篇详细的客户数据清洗指南能帮助您提升数据质量!如果觉得本文有帮助,请点赞、收藏、转发支持一下!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-08 18:19:01 HTTP/2.0 GET : https://f.mffb.com.cn/a/474310.html
  2. 运行时间 : 0.107766s [ 吞吐率:9.28req/s ] 内存消耗:4,881.20kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=df4683a5e5eab6d3d4bd0f0cc8e57a55
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000943s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001407s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.003186s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.001991s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000512s ]
  6. SELECT * FROM `set` [ RunTime:0.002905s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000611s ]
  8. SELECT * FROM `article` WHERE `id` = 474310 LIMIT 1 [ RunTime:0.007101s ]
  9. UPDATE `article` SET `lasttime` = 1770545941 WHERE `id` = 474310 [ RunTime:0.009475s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.000504s ]
  11. SELECT * FROM `article` WHERE `id` < 474310 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000671s ]
  12. SELECT * FROM `article` WHERE `id` > 474310 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.000466s ]
  13. SELECT * FROM `article` WHERE `id` < 474310 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.000696s ]
  14. SELECT * FROM `article` WHERE `id` < 474310 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.004264s ]
  15. SELECT * FROM `article` WHERE `id` < 474310 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.002143s ]
0.109322s