本文面向 HarmonyOS 7 应用开发。涉及系统能力时,以项目实际安装 SDK 的 API、权限及设备支持为准;下文代码注明为局部示例,不构成完整可运行工程。

能选中文件,不代表能直接解析

客户把一个名叫“名单.csv”的文件导入应用,界面提示成功,打开后却只有一列乱码。原因可能是编码,也可能是分隔符,甚至文件本来就不是 CSV。文件选择器解决的是“用户选了什么”,业务还要回答“这个文件是否符合导入约定”。

在鸿蒙应用里,可以通过 Core File Kit 的文件选择能力取得用户选择的资源。不要为了导入一份文档去扫描公共目录。选中以后先检查元信息,再读取有限内容,最后才进入完整解析。

在这里插入图片描述

给导入建立明确的合同

假设我们导入客户名单,合同应写清楚:只接受 UTF-8 CSV;首行为姓名、手机号、城市;最多一万行;文件上限由业务确定。大小和行数是产品规则,不是系统默认值。把这些条件放在选择入口附近,错误发生时也容易解释。

导入可拆为“选择—读取—解析—校验—预览—确认写入”。解析阶段只生成候选记录,不直接改变现有名单。预览页显示有效行、重复行和错误行,用户确认之后再提交。

下面是一个纯业务校验片段,不调用文件 API:

interface ContactRow {
  name: string;
  phone: string;
}
function validateContact(row: ContactRow): string {
  if (row.name.trim().length === 0) return '姓名不能为空';
  if (!/^1[3-9]\d{9}$/.test(row.phone.trim())) {
    return '手机号格式不符合本次导入规则';
  }
  return '';
}

手机号规则只适用于本例的中国大陆移动号码业务,不应复用成全球电话号码标准。

不要用 split 充当完整 CSV 解析器

字段可能包含引号、逗号和换行。例如地址“上海市,浦东新区”是一个字段,不能按每个逗号拆开。选用解析方案时,必须用这些输入验证。读取大文件还应设置字节上限和记录上限;不要先把全部内容放入内存,再发现超限。

导入时给每行保留原始行号。用户看到“第38行手机号为空”就能定位;只看到“格式错误”只能重新猜。错误报告可提供下载,但应避免在报告中额外扩散不必要的个人信息。

重复导入要提前定义

同一个文件点两遍确认,是新增两份,还是自动去重?建议由稳定的业务键决定,例如客户编号。文件名不能承担这项职责,因为不同文件可以同名,同一文件也可以改名。

如果写入过程中失败,采用事务或可恢复的批次设计,让用户知道已经写入多少、还剩多少。不要返回一个笼统的失败后,让用户再次导入造成重复。

验收时准备空文件、错误扩展名、带引号字段、含表头但无数据、超限文件和重复文件。把这六类都处理清楚,导入功能才从“开发机能跑”变成了“用户能放心使用”。

官方参考

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐