csv의 파일 이름과 zip 내부의 비동기 읽기로 내용을 모두 가져올 수 없습니다.

필립

여러 개의 다른 zip 파일을 포함하는 zip 파일을로드하는 함수를 코딩하고, 이들을 반복하고, 결과를 하나의 집계 된 csv로 병합하고 추출하는 모든 csv 파일을 추출합니다. 내가 만난 문제는 csv의 내용을 비동기로 파일 이름이나 디렉토리에 매핑 할 수 없다는 것입니다. 다음은 myzip2가 JSZIP 객체이고 파일이 파일 이름의 사전이며 csvfiles가 출력 배열 인 코드입니다.

    for (var key in files) {
        if ( files[key].name.includes('.csv') ) {
            myzip2.file( files[key].name ).async("string").then( function(result) {
                csvfiles.push( $.csv.toArrays(result) ); // contains the csv content
                csvfiles.push( files[key].name ); // undefined in async
            });
        )
    )

csv 콘텐츠와 파일 이름을 동시에 푸시하고 싶지만 파일 이름은 함수 내에서 정의되지 않았습니다. 어떻게받을 수 있습니까? 나는 내 문제를 검색 할 기회가 많지 않았고, 아마도 정확한 표현이 부족했을 것이다.

감사


누구든지 같은 문제가 발생하는 경우 파일 이름을 콘텐츠와 일치시키는 것은 화살표 함수로 해결되는 종료 문제이지만 올바른 zip 파일 이름을 일치시키는 것은 JSZip이 현재 객체에 추가되는 문제입니다. new JSZip()이전 항목을 지워야하는 경우 사용 합니다.

전체 코드, zipfiles는 mainzip 안에 포함 된 zipfiles 이름 목록입니다.

var csvfiles = []
for (var i = 0; i < zipfiles.length; i++) {

    let thiszipname = zipfiles[i];
    let thiszip = mainzip.file( thiszipname ).async("blob");

    var newzip = new JSZip();
    newzip.loadAsync( thiszip ).then(
        subzip => {
            let subfiles = subzip.files;
            Object.keys(subfiles).forEach( filename => {

                if ( filename.includes('.csv') ) {
                    subzip.file( filename ).async("string").then(
                        readData => {
                            var obj = $.csv.toObjects(readData); // works great
                            obj['csvfile'] = filename            // correct file
                            obj['zipfile'] = thiszipname;        // incorrect zipfile...
                            csvfiles.push( obj );
                        }
                    );
                }
            })

        }
    )
} console.log(csvfiles)
블라디미르 세리 흐

문제는 files변수 의 어휘 범위와 관련이 있습니다. 와 관련이 없습니다 async.

클로저는 주변 상태 (어휘 환경)에 대한 참조와 함께 번들로 묶인 (포함 된) 함수의 조합입니다. 즉, 클로저는 내부 함수에서 외부 함수의 범위에 대한 액세스를 제공합니다. JavaScript에서는 함수가 생성 될 때마다 클로저가 생성됩니다.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures


루프에서이 작업을 수행 할 때 "루프에서 폐쇄"문제를 처리해야합니다.

동일한 링크 다음에있는 " 루프에서 클로저 생성 : 일반적인 실수 " 섹션을 확인 하십시오. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures


익명 함수를 화살표 함수로 바꾸면 작동합니다.

for (var key in files) {
    // It's important to set the value of the `files[key]` to the separate variable.
    // Because otherwise the last element of the `files` will be captured in the closure for the expression `files[key]`.
    const fileName = files[key].name;
    myzip2
        .file(fileName)
        .async("string")
        // Arrow function `result => {}` creates a closure that captures `fileName` variable from the external scope
        .then(result => {
            csvfiles.push($.csv.toArrays(result));
            csvfiles.push(fileName);
        });
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

파일 선택기에서 선택한 파일의 이름을 가져올 수 없습니다.

분류에서Dev

Sitefinity CMS 내보내기 / 가져 오기 메뉴에서 ZIP 파일을 다운로드 할 수 없습니다.

분류에서Dev

두 개의 동일한 CSV 파일이 있지만 UnicodeDecodeError로 인해 Pandas DataFrame으로 읽을 수 없습니다.

분류에서Dev

unrar없이 rar 내부의 파일 이름 가져 오기

분류에서Dev

unrar없이 rar 내부의 파일 이름 가져 오기

분류에서Dev

zip (php)의 모든 파일을 추가 할 수 없습니다.

분류에서Dev

Javascript 비동기 약속 : 내 데이터를 가져올 수 없습니다.

분류에서Dev

특정 노드의 내용을 XML 파일에서 vba로 가져올 수 없습니다.

분류에서Dev

다른 파일의 내용과 정확히 일치하는 내용을 기준으로 파일 이름의 일부 이름 변경

분류에서Dev

C의 argv [1]에서 파일 이름을 가져올 수 없습니다.

분류에서Dev

파이프 내부에 설정된 쉘 변수의 정확한 값을 가져올 수 없습니다.

분류에서Dev

내 테이블 jquery의 내용을 가져올 수 없습니다.

분류에서Dev

큰 크기의 CSV를 SQL로 가져 오면 다음 경고가 표시됩니다. fopen () : 파일 이름은 비워 둘 수 없습니다.

분류에서Dev

txt 파일을 변수로 읽을 때 Java의 내용 대신 텍스트 파일의 URL 가져 오기

분류에서Dev

CommonJS 모듈의 일부를 가져 오는 동안 암시 적으로 '모든'유형이있는 모듈의 선언 파일을 찾을 수 없습니다.

분류에서Dev

R에있는 다른 csv 파일의 내용을 기반으로 csv 파일의 데이터 부분 설정

분류에서Dev

drupal 7 내부보기 템플릿의 분류에서 필드 값을 가져올 수 없습니다.

분류에서Dev

비동기 함수의 결과를 별도의 js 파일로 내보내고 결과를 다른 자바 스크립트로 가져옵니다.

분류에서Dev

PHP가 원격 파일의 내용을 읽을 수 없습니다.

분류에서Dev

작업 공간 xcode7의 두 프로젝트간에 파일을 가져올 수 없습니다.

분류에서Dev

어떤 파이썬 내장 함수가 목록의 모든 요소에 일부 기능을 적용 할 수 있습니까?

분류에서Dev

컨테이너 <div>의 내용을 제대로 가운데로 가져올 수 없습니다.

분류에서Dev

공기 흐름에서 모듈 '__main__'의 'ClassName'속성을 가져올 수 없습니다.

분류에서Dev

배치 파일을 사용하여 ZIP 파일 내의 파일 이름을 바꿀 수 있습니까?

분류에서Dev

Jar가 내부 파일의 경로를 찾을 수 없습니다.

분류에서Dev

dll의 모든 C # 클래스 파일을 nunit으로 가져올 수 없습니다.

분류에서Dev

Linux 우분투 시스템에서 이메일을 보내기 위해 django settings.py의 환경 변수를 가져올 수 없습니다.

분류에서Dev

이메일에서 첨부 파일 추출-첨부 파일의 파일 이름을 가져올 수 없습니다.

분류에서Dev

외부 파일의 내용을 가져와 변수로 정의

Related 관련 기사

  1. 1

    파일 선택기에서 선택한 파일의 이름을 가져올 수 없습니다.

  2. 2

    Sitefinity CMS 내보내기 / 가져 오기 메뉴에서 ZIP 파일을 다운로드 할 수 없습니다.

  3. 3

    두 개의 동일한 CSV 파일이 있지만 UnicodeDecodeError로 인해 Pandas DataFrame으로 읽을 수 없습니다.

  4. 4

    unrar없이 rar 내부의 파일 이름 가져 오기

  5. 5

    unrar없이 rar 내부의 파일 이름 가져 오기

  6. 6

    zip (php)의 모든 파일을 추가 할 수 없습니다.

  7. 7

    Javascript 비동기 약속 : 내 데이터를 가져올 수 없습니다.

  8. 8

    특정 노드의 내용을 XML 파일에서 vba로 가져올 수 없습니다.

  9. 9

    다른 파일의 내용과 정확히 일치하는 내용을 기준으로 파일 이름의 일부 이름 변경

  10. 10

    C의 argv [1]에서 파일 이름을 가져올 수 없습니다.

  11. 11

    파이프 내부에 설정된 쉘 변수의 정확한 값을 가져올 수 없습니다.

  12. 12

    내 테이블 jquery의 내용을 가져올 수 없습니다.

  13. 13

    큰 크기의 CSV를 SQL로 가져 오면 다음 경고가 표시됩니다. fopen () : 파일 이름은 비워 둘 수 없습니다.

  14. 14

    txt 파일을 변수로 읽을 때 Java의 내용 대신 텍스트 파일의 URL 가져 오기

  15. 15

    CommonJS 모듈의 일부를 가져 오는 동안 암시 적으로 '모든'유형이있는 모듈의 선언 파일을 찾을 수 없습니다.

  16. 16

    R에있는 다른 csv 파일의 내용을 기반으로 csv 파일의 데이터 부분 설정

  17. 17

    drupal 7 내부보기 템플릿의 분류에서 필드 값을 가져올 수 없습니다.

  18. 18

    비동기 함수의 결과를 별도의 js 파일로 내보내고 결과를 다른 자바 스크립트로 가져옵니다.

  19. 19

    PHP가 원격 파일의 내용을 읽을 수 없습니다.

  20. 20

    작업 공간 xcode7의 두 프로젝트간에 파일을 가져올 수 없습니다.

  21. 21

    어떤 파이썬 내장 함수가 목록의 모든 요소에 일부 기능을 적용 할 수 있습니까?

  22. 22

    컨테이너 <div>의 내용을 제대로 가운데로 가져올 수 없습니다.

  23. 23

    공기 흐름에서 모듈 '__main__'의 'ClassName'속성을 가져올 수 없습니다.

  24. 24

    배치 파일을 사용하여 ZIP 파일 내의 파일 이름을 바꿀 수 있습니까?

  25. 25

    Jar가 내부 파일의 경로를 찾을 수 없습니다.

  26. 26

    dll의 모든 C # 클래스 파일을 nunit으로 가져올 수 없습니다.

  27. 27

    Linux 우분투 시스템에서 이메일을 보내기 위해 django settings.py의 환경 변수를 가져올 수 없습니다.

  28. 28

    이메일에서 첨부 파일 추출-첨부 파일의 파일 이름을 가져올 수 없습니다.

  29. 29

    외부 파일의 내용을 가져와 변수로 정의

뜨겁다태그

보관