web-dev-qa-db-ja.com

Angular2のCSVファイルを1行ずつ読み込む方法

私はangular2でアプリケーションをプログラミングしており、htmlで単純に入力されたcsvファイルを読み取ります:

<input type='file' name='userFile' id='file' >

Component.tsでファイルにアクセスできます。

ngOnInit() {

   var input = (<HTMLInputElement>document.getElementById("file"));
   input.addEventListener("change", function(event) {
      var files = input.files;
      var len = files.length;

         if (len) {
          console.log("Filename: " + files[0].name);
          console.log("Type: " + files[0].type);
          console.log("Size: " + files[0].size + " bytes");

         }

      }, false);

}

TypeScript、javascriptまたはjqueryを使用してアップロードされたcsvファイルをセルごとに読み取るにはどうすればよいですか? (そしてそれを行う最良の方法です)。

5
user6223678

以下に実装例を示しますangular way:

@Component({
  selector: 'app-my-file',
  template: `
   <div class="form-group">
        <input type="file" (change)="onFileSelect($event.target)" name="myfile">
   </div>
  `,
  styles: [``]
})
export class YourComponent implements OnInit {

    csvContent: string;

    constructor(){}
    ngOnInit(){
    }

    onFileLoad(fileLoadedEvent) {
            const textFromFileLoaded = fileLoadedEvent.target.result;              
            this.csvContent = textFromFileLoaded;     
            // alert(this.csvContent);
    }

    onFileSelect(input: HTMLInputElement) {

      const files = input.files;
      var content = this.csvContent;    
      if (files && files.length) {
         /*
          console.log("Filename: " + files[0].name);
          console.log("Type: " + files[0].type);
          console.log("Size: " + files[0].size + " bytes");
          */

          const fileToRead = files[0];

          const fileReader = new FileReader();
          fileReader.onload = this.onFileLoad;

          fileReader.readAsText(fileToLoad, "UTF-8");
      }

    }
}

StackBlitzで試してみてください

8
asmmahmud

asmmahmud's answer に加えて、ファイルコンテンツを実際に解析する方法を追加して、配列に行と列があるようにします(Angular with TypeScript)。プロパティを追加します。

parsedCsv: string[][];

彼の例のYourComponentクラスに。次に、onFileLoadイベントを次のように更新します。

onFileLoad(fileLoadedEvent): void {
 const csvSeparator = ';';
 const textFromFileLoaded = fileLoadedEvent.target.result;
 this.csvContent = textFromFileLoaded;
 // alert(textFromFileLoaded);

 const txt = textFromFileLoaded;
 const csv = [];
 const lines = txt.split('\n');
 lines.forEach(element => {
   const cols: string[] = element.split(csvSeparator);
   csv.Push(cols);
 });
 this.parsedCsv = csv;
 // console.log(this.parsedCsv);
}

これで、2次元配列parsedCsv(1次元が行、2次元が列)の行と列を含む解析済みCSVができました。必要に応じてセパレータを置き換えることができます-デフォルトはセミコロンです。

例:

を含むファイル

A; B; C
1; 2,300; 3
4; 5.5; 6

parsedCsvに次のデータ構造を生成します

ExampleContent

ファイルに列ヘッダーが含まれている場合、データは行インデックス1で始まり、それ以外の場合(列ヘッダーなしで)行インデックス0で始まることがわかります。

Stackblitzの例の更新

注:Stackblitzで、次の数行を追加して、配列がどのように読み込まれるかを確認できるようにしました。

  // demo output as alert
  var output: string="";
  csv.forEach(row => {
    output += "\n";
    var colNo = 0;
    row.forEach(col => {
      if (colNo>0) output += " | ";
      output += col;
      colNo++;
    });
  });
  alert(output);
6
Matt
csv2Array(fileInput: any){
//read file from input
this.fileReaded = fileInput.target.files[0];

let reader: FileReader = new FileReader();
reader.readAsText(this.fileReaded);

reader.onload = (e) => {
  let csv: string = reader.result;
  let allTextLines = csv.split(/\r|\n|\r/);
  let headers = allTextLines[0].split(',');
  let lines = [];

  for (let i = 0; i < allTextLines.length; i++) {
    // split content based on comma
    let data = allTextLines[i].split(',');
    if (data.length === headers.length) {
      let tarr = [];
      for (let j = 0; j < headers.length; j++) {
        tarr.Push(data[j]);
      }

      // log each row to see output 
      console.log(tarr);
      lines.Push(tarr);
    }
  }
  // all rows in the csv file 
  console.log(">>>>>>>>>>>>>>>>>", lines);
} }
3
Mahendra Waykos

テキストを抽出する方法を見つけました:

    var fr = new FileReader();
    fr.onload = function(e) {
      var text = fr.result;
      console.log(text);
    };
    fr.readAsText(files[0]);

そして、別々の行とセルを配列に分割して使用します:

var rows = text.split("\n");
console.log("Row 0 " + rows[0]);
console.log("Row 1 " + rows[1]);
console.log("Row 2 " + rows[2]);
var row1 = rows[0].split(";");
console.log("Value 0,0 " + row1[0]);
console.log("Value 0,1 " + row1[1]);
console.log("Value 0,2 " + row1[2]);

*セルに「;」が含まれる場合、このコードはうまく機能しません。文字、私のアプリケーションの場合ではありません。

0
user6223678