You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Angular中将上传数据的9位数字转为10位数字

问题描述

我是Angular新手,现有Angular页面可上传含6列数据的.csv文件。在调用.NET API前,需处理第一列数据:若值为9位数字,需在其前缀添加‘0’转为10位数字(例如‘609878837’转为‘0609878837’)。

示例数据

UserNumber      876876876               
DESCRIPTION     Hello               
AccountNumber   State   Current Premium Interest    Total
1207614641       FL         GG  200.51   24.58     225.09
 217614234       FL         GG  474.65   51.77     526.42

现有Angular代码

模板代码

<input #fileUpload type="file" class="file-upload" name="fileUpload" id="fileUpload" accept=".xlsx,.xls,.csv" required (change)="onFileChange($event)">
<button (click)="UploadFile(form.value)" type="button" mat-raised-button color="primary" [disabled]="!fileSelected">Upload</button>

组件逻辑代码

onFileChange(event: any): void {
  this.file = event.target.files[0];

  if (this.file) {
    console.log("this.file.type: " + this.file.type);

    const fileName = this.file.name;

    this.fileSelected = true;
    this.invalidFileType = false;
    this.invalidFileSize = false;
    this.invalidFileRecords = false;
    let file: File = this.file;
    var value;
    const fileReader = new FileReader();

    fileReader.onload = (e: any) => {
      value = e.target.result;

      this.data = value;

      var rows = e.target.result.split("\n");
      if (rows.length > 6003) {
        LoggerService.error(`upload records less than 6K.`, true, true);
      }

    };

    fileReader.readAsBinaryString(this.file);
  }
}
    

UploadFile(filevalue) {
  const reqbody = {
    filename: this.file?.name,
    destinationPath: '',
    lines: this.data.replace(/[^a-zA-Z0-9,\n\r.'"]/g, "").split('\r\n')
  };

  var route = "CallNETAPI";
  this.dataService.post(reqbody, route).subscribe(
    (data: any[]) => {
      console.log("Response data: " + data);
      LoggerService.success(`File successfully uploaded to server`, true, false);
      this.responseData = data;
    },
    (error: Response) => {
      this.displayError = true;
      this.errorText = `Error from CallNETAPI API service ${error.status}`;
    });
}
解决方案

你可以在构建请求体前,遍历每行数据并针对性处理第一列,以下是两种可行方案:

方案一:在UploadFile中直接处理(推荐)

修改UploadFile方法,在生成lines数组时完成格式修正:

UploadFile(filevalue) {
  // 处理每行数据,修正第一列格式
  const processedLines = this.data.replace(/[^a-zA-Z0-9,\n\r.'"]/g, "").split('\r\n').map(line => {
    // 跳过空行和表头行
    if (!line.trim() || line.startsWith('UserNumber') || line.startsWith('DESCRIPTION') || line.startsWith('AccountNumber')) {
      return line;
    }

    // 按空格分割列(兼容多空格分隔的情况)
    const columns = line.trim().split(/\s+/);
    if (columns.length === 0) return line;

    // 判断第一列是否为9位纯数字,是则前缀加0
    const firstCol = columns[0].trim();
    if (/^\d{9}$/.test(firstCol)) {
      columns[0] = '0' + firstCol;
    }

    // 重新拼接成原格式的行
    return columns.join(' ');
  });

  const reqbody = {
    filename: this.file?.name,
    destinationPath: '',
    lines: processedLines
  };

  var route = "CallNETAPI";
  this.dataService.post(reqbody, route).subscribe(
    (data: any[]) => {
      console.log("Response data: " + data);
      LoggerService.success(`File successfully uploaded to server`, true, false);
      this.responseData = data;
    },
    (error: Response) => {
      this.displayError = true;
      this.errorText = `Error from CallNETAPI API service ${error.status}`;
    });
}

方案二:在读取文件时提前处理

如果希望在文件读取阶段就完成数据修正,可以修改onFileChange中的fileReader.onload逻辑:

fileReader.onload = (e: any) => {
  value = e.target.result;

  // 提前处理数据格式
  const processedValue = value.split("\n").map(line => {
    if (!line.trim() || line.startsWith('UserNumber') || line.startsWith('DESCRIPTION') || line.startsWith('AccountNumber')) {
      return line;
    }
    const columns = line.trim().split(/\s+/);
    if (columns.length === 0) return line;
    const firstCol = columns[0].trim();
    if (/^\d{9}$/.test(firstCol)) {
      columns[0] = '0' + firstCol;
    }
    return columns.join(' ');
  }).join("\n");

  this.data = processedValue;

  var rows = processedValue.split("\n");
  if (rows.length > 6003) {
    LoggerService.error(`upload records less than 6K.`, true, true);
  }
};

关键逻辑说明

  • 用map遍历每行,跳过无需处理的空行和表头
  • 正则/\s+/处理多空格分隔的列,兼容CSV的格式
  • 正则/^\d{9}$/精准匹配9位纯数字,避免误处理其他格式的内容

内容的提问来源于stack exchange,提问作者kumas srunk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 09:53:18