HarmonyOS 鸿蒙Next应用如何加载读取csv文件

HarmonyOS 鸿蒙Next应用如何加载读取csv文件 csv是一种文本文件格式,与json类似。会存储一些文本内容,应用需要读取该文件,进行UI内容得填充等。 文件中的数据是以纯文本形式存储的,并且数据行和字段之间通过特定的分隔符(通常是逗号)分隔。 CSV 文件示例

xx.csv
姓名,年龄,城市
张三,28,北京
李四,34,上海
王五,22,广州

数据结构:
export default class TestObj{
  name: string = "";
  age: string = "";
  city: string = "";
}

在上面得示例中:

第一行是表头,定义了三个字段:姓名、年龄和城市。 接下来的三行是数据记录,每行包含一条记录。 字段之间用逗号分隔。

鸿蒙应用如何加载读取csv文件呢?


更多关于HarmonyOS 鸿蒙Next应用如何加载读取csv文件的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

1. 方式一: 使用三方提供得SDK进行csv文件得解析: “@ohos/opencsv”: “2.0.0”

import { getPath, openSync,CSVReaderBuilder,CSVParser } from '[@ohos](/user/ohos)/opencsv';
getPath().then((path) => {
    let rd = openSync (path,'test.csv'/* csv filename */,0o2)
    let readerBuilder: CSVReaderBuilder = new CSVReaderBuilder(rd)
    let readerbuildcsv = readerBuilder
          .withCSVParser(new CSVParser())
          .buildCSVReader()
    let lines: Array<Array<string>> = null;
    lines = readerbuildcsv.readAll() // Read all data in the CSV file.
    console.log(lines)
    /* [
     *  [1,'Zhang San',18]
     *  [2,'Li Si',19]
     *  [3,'Wang Wu', 20]
     *  [4,'Zhao Liu', 21]
     *               ]
     */
    readerbuildcsv.close () // Close reading.
})

2. 方式二:

  private parseCsvToStrings(csvString: string, delimiter = ','): Array<TestObj> {
    const lines = csvString.trim().split('\n');
    const headers = lines[0].split(delimiter);
    // 将object替换为你的目标对象类型
    const data: Array<TestObj> = new Array();

    for (let i = 1; i < lines.length; i++) {
      const values = lines[i].split(delimiter);
      const row: TestObj = new TestObj();
      headers.forEach((header, index) => {
        let res: string = values[index]?.trim()?.toString() || '';
        switch (header.trim()){
          case "name":
            row.name = res;
            break;
          case "age":
            row.name = res;
            break;
          case "city":
            row.name = res;
            break;
        }
      });
      data.push(row);
    }
    return data;
  }

注意: 对于大型CSV文件,手动解析可能会比较慢,而使用优化的第三方库可能会更快。

更多关于HarmonyOS 鸿蒙Next应用如何加载读取csv文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,读取CSV文件主要使用@ohos.file.fs@ohos.util模块。首先通过fs.openSync获取文件描述符,然后使用fs.readSync读取文件内容为ArrayBuffer。接着,利用util.TextDecoder将二进制数据解码为字符串。最后,对字符串按行分割并解析CSV格式数据。整个过程需注意文件路径权限和异步操作处理。

在HarmonyOS Next中读取CSV文件,可以通过以下步骤实现:

1. 文件放置与访问

将CSV文件放在应用的resources/rawfile目录下,通过ResourceManager访问:

import { resourceManager } from '@kit.AbilityKit';

// 获取资源管理器
const context = getContext(this) as common.UIAbilityContext;
const resourceMgr = context.resourceManager;

// 读取CSV文件
const rawFile = await resourceMgr.getRawFileContent('xx.csv');
const csvText = String.fromCharCode.apply(null, Array.from(rawFile));

2. 解析CSV数据

实现CSV解析函数:

function parseCSV(csvText: string): TestObj[] {
  const lines = csvText.split('\n');
  const result: TestObj[] = [];
  
  // 获取表头
  const headers = lines[0].split(',');
  
  // 解析数据行
  for (let i = 1; i < lines.length; i++) {
    if (lines[i].trim() === '') continue;
    
    const obj = new TestObj();
    const currentLine = lines[i].split(',');
    
    for (let j = 0; j < headers.length; j++) {
      const header = headers[j].trim();
      const value = currentLine[j] ? currentLine[j].trim() : '';
      
      switch(header) {
        case '姓名':
          obj.name = value;
          break;
        case '年龄':
          obj.age = value;
          break;
        case '城市':
          obj.city = value;
          break;
      }
    }
    result.push(obj);
  }
  
  return result;
}

3. 完整示例

import { common } from '@kit.AbilityKit';

export default class CSVReader {
  async loadCSVData(): Promise<TestObj[]> {
    try {
      const context = getContext(this) as common.UIAbilityContext;
      const resourceMgr = context.resourceManager;
      
      // 读取文件
      const rawFile = await resourceMgr.getRawFileContent('xx.csv');
      const csvText = String.fromCharCode.apply(null, Array.from(rawFile));
      
      // 解析数据
      return this.parseCSV(csvText);
    } catch (error) {
      console.error('读取CSV文件失败:', error);
      return [];
    }
  }
  
  private parseCSV(csvText: string): TestObj[] {
    // 解析逻辑同上
  }
}

4. 在UI中使用

@Entry
@Component
struct CSVDisplay {
  @State data: TestObj[] = [];
  
  aboutToAppear() {
    const reader = new CSVReader();
    reader.loadCSVData().then(result => {
      this.data = result;
    });
  }
  
  build() {
    List() {
      ForEach(this.data, (item: TestObj) => {
        ListItem() {
          Text(`${item.name} - ${item.age}岁 - ${item.city}`)
            .fontSize(16)
            .margin(10)
        }
      })
    }
  }
}

注意事项:

  1. CSV文件需要放在resources/rawfile目录
  2. 处理可能的空行和格式异常
  3. 考虑使用第三方库如papaparse处理复杂CSV格式
  4. 大文件建议分块读取避免内存问题

这种方法适用于静态数据加载,如果是动态数据建议使用网络请求或文件系统API。

回到顶部