Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 使用带Ionic 4的Papa解析从CSV数据导入特定列_Angular_Ionic Framework_Papaparse - Fatal编程技术网

Angular 使用带Ionic 4的Papa解析从CSV数据导入特定列

Angular 使用带Ionic 4的Papa解析从CSV数据导入特定列,angular,ionic-framework,papaparse,Angular,Ionic Framework,Papaparse,我有一些代码使用Papa Parse插件将CSV数据拉入我的Ionic 4应用程序,但我想拉入特定的数据字段-不确定如何拉入 例如,如果我只想显示“First Name”和“Last Name”而不是所有字段,该怎么办 dummyData.csv Date,"First Name","Last Name","Email","Amount","Currency","InvoiceID","Country" 08.22.2019,"Simon","Grimm","saimon@devdactic.c

我有一些代码使用Papa Parse插件将CSV数据拉入我的Ionic 4应用程序,但我想拉入特定的数据字段-不确定如何拉入

例如,如果我只想显示“First Name”和“Last Name”而不是所有字段,该怎么办

dummyData.csv

Date,"First Name","Last Name","Email","Amount","Currency","InvoiceID","Country"
08.22.2019,"Simon","Grimm","saimon@devdactic.com","50,00","EUR","0001","GER"
08.21.2019,"Simon","Grimm","saimon@devdactic.com","45,00","EUR","0002","GER"
08.19.2019,"Simon","Grimm","saimon@devdactic.com","40,00","EUR","0003","GER"
08.18.2019,"Simon","Grimm","saimon@devdactic.com","35,00","EUR","0004","GER"
08.17.2019,"Simon","Grimm","saimon@devdactic.com","30,00","EUR","0005","GER"
08.16.2019,"Simon","Grimm","saimon@devdactic.com","25,00","EUR","0006","GER"
TS脚本页

import { Component, OnInit } from '@angular/core';
import { Papa } from 'ngx-papaparse';
import { Platform } from '@ionic/angular';
import { File } from '@ionic-native/file/ngx';
import { SocialSharing } from '@ionic-native/social-sharing/ngx';
import { HttpClient } from '@angular/common/http';


@Component({
  selector: 'app-examination-test',
  templateUrl: './examination-test.page.html',
  styleUrls: ['./examination-test.page.scss'],
})

export class  ExaminationTestPage {
  csvData: any[] = [];
  headerRow: any[] = [];

  constructor(
    private http: HttpClient,
    private papa: Papa,
    private plt: Platform,
    private file: File,
    private socialSharing: SocialSharing,
  ) {
    this.loadCSV();
  }

  private loadCSV() {
    this.http
      .get('./assets/Sins.csv', {
        responseType: 'text'
      })
      .subscribe(
        data => this.extractData(data),
        err => console.log('something went wrong: ', err)
      );
  }

  private extractData(res) {
    let csvData = res || '';

    this.papa.parse(csvData, {
      complete: parsedData => {
        this.headerRow = parsedData.data.splice(0, 1)[0];
        this.csvData = parsedData.data;
      }
    });
  }

  exportCSV() {
    let csv = this.papa.unparse({
      fields: this.headerRow,
      data: this.csvData
    });

    if (this.plt.is('cordova')) {
      this.file.writeFile(this.file.dataDirectory, 'Sins.csv', csv, {replace: true}).then( res => {
        this.socialSharing.share(null, null, res.nativeURL, null).then(e =>{
          // Success
        }).catch(e =>{
          console.log('Share failed:', e)
        });
      }, err => {
        console.log('Error: ', err);
      });

    } else {
      // Dummy implementation for Desktop download purpose
      var blob = new Blob([csv]);
      var a = window.document.createElement('a');
      a.href = window.URL.createObjectURL(blob);
      a.download = 'newdata.csv';
      document.body.appendChild(a);
      a.click();
      document.body.removeChild(a);
    }
  }

  trackByFn(index: any, item: any) {
    return index;
  }
}
HTML脚本

<ion-header>
  <ion-toolbar color="primary">
    <ion-title>
      Devdactic CSV
    </ion-title>
    <ion-buttons slot="start">
      <ion-button (click)="exportCSV()">
        Export
      </ion-button>
    </ion-buttons>
  </ion-toolbar>
</ion-header>

<ion-content scrollX="true">
  <table border="1" class="data-table">
    <tbody>
      <tr>
        <td *ngFor="let header of headerRow" text-center>
          <b>{{ header }}</b>
        </td>
      </tr>
      <tr *ngFor="let row of csvData; let i = index">
        <td
          *ngFor="let data of row; let j = index; trackBy: trackByFn"
          class="data-col"
        >
          <ion-input type="text" [(ngModel)]="csvData[i][j]"></ion-input>
        </td>
      </tr>
    </tbody>
  </table>
</ion-content>


Devdactic CSV
出口
{{header}}
检查以下内容后:

private extractData(res) {
    let csvData = res || '';

    this.papa.parse(csvData, {
      complete: parsedData => {
        this.headerRow = parsedData.data.splice(0, 1)[0];
        this.csvData = parsedData.data;
      }
    });
  }
将结果留给您,它似乎将每一行作为数组的条目留给您

我要做的是两件事,这取决于具体情况,但这假设csv每次都以相同的8列结束。 首先是一个接口:

interface InvoiceDetails {
date: moment();
firstName: string; 
lastName: string;
email: string;`enter code here`
amount: number;
currency: string
invoiceId: string;
country: string;
}
然后,为了方便起见,我会添加一个枚举:

enum Column {
Date = 0,
FirstName = 1,
LastName = 2,
Email = 3,
Amount = 4,
Currency = 5,
InvoiceID = 6,
Country = 7
}
然后我会在extractData方法中添加一个方法:

  private extractData(res) {
    let csvData = res || '';

    this.papa.parse(csvData, {
      complete: parsedData => {
        this.headerRow = parsedData.data.splice(0, 1)[0];
        this.csvData = this.remapToInvoiceDetails(parsedData.data);
      }
    });
  }
然后remapToInvoiceDetails将如下所示:

remapToInvoiceDetails(csvData: string[]) {
 const invoices: InvoiceDetails[] = [];
 for (const data of csvData) {
  invoices.push({
   date: data[Column .Date],
   firstname: data[Column .FirstName],
   lastName: data[Column .LastName],
   email: data[Column .Email],
   amount: data[Column .Amount],
   currency:  data[Column .Currency],
   invoiceID: data[Column .InvoiceID],
   country: data[Column .Country],
   });
  }
 return invoices;
 }
通过这样做,您可以在允许您使用intellisense的结构中获得数据,并且您可以更轻松地选择所需的属性。也就是说,假设您现在这样定义csvData:

csvData: Invoices[] = [];   
但我现在只能称之为发票或更合适的名称,因为现在它是结构化的。 注意:假设您总是得到8列,并且没有空检查,因此也需要添加空检查。

检查内容后:

private extractData(res) {
    let csvData = res || '';

    this.papa.parse(csvData, {
      complete: parsedData => {
        this.headerRow = parsedData.data.splice(0, 1)[0];
        this.csvData = parsedData.data;
      }
    });
  }
将结果留给您,它似乎将每一行作为数组的条目留给您

我要做的是两件事,这取决于具体情况,但这假设csv每次都以相同的8列结束。 首先是一个接口:

interface InvoiceDetails {
date: moment();
firstName: string; 
lastName: string;
email: string;`enter code here`
amount: number;
currency: string
invoiceId: string;
country: string;
}
然后,为了方便起见,我会添加一个枚举:

enum Column {
Date = 0,
FirstName = 1,
LastName = 2,
Email = 3,
Amount = 4,
Currency = 5,
InvoiceID = 6,
Country = 7
}
然后我会在extractData方法中添加一个方法:

  private extractData(res) {
    let csvData = res || '';

    this.papa.parse(csvData, {
      complete: parsedData => {
        this.headerRow = parsedData.data.splice(0, 1)[0];
        this.csvData = this.remapToInvoiceDetails(parsedData.data);
      }
    });
  }
然后remapToInvoiceDetails将如下所示:

remapToInvoiceDetails(csvData: string[]) {
 const invoices: InvoiceDetails[] = [];
 for (const data of csvData) {
  invoices.push({
   date: data[Column .Date],
   firstname: data[Column .FirstName],
   lastName: data[Column .LastName],
   email: data[Column .Email],
   amount: data[Column .Amount],
   currency:  data[Column .Currency],
   invoiceID: data[Column .InvoiceID],
   country: data[Column .Country],
   });
  }
 return invoices;
 }
通过这样做,您可以在允许您使用intellisense的结构中获得数据,并且您可以更轻松地选择所需的属性。也就是说,假设您现在这样定义csvData:

csvData: Invoices[] = [];   
但我现在只能称之为发票或更合适的名称,因为现在它是结构化的。
注意:假设您总是得到8列,并且没有空检查,因此也需要添加。

我为导出按钮找到了答案-只是不在显示屏上我为导出按钮找到了答案-只是不在显示屏上