2015-01-21 37 views
9

'daki bir giriş tarafından sağlanan CSV dosyasını ayrıştırma .csv dosyasının yüklenmesini sağlayan bir webapp oluşturuyorum.Angular

Sunucumdaki tüm dosyayı yüklemek yerine, PHP sayesinde bir tablodaki her satırı eklemek, Angular'deki dosyayı ayrıştırmak ve ardından ayrıştırılmış çizgiler eklemek istiyorum (Restangular sayesinde). Bu şekilde, yüklemeden önce bazı "hataları" alabilmem gerekir (veya değil).

<input type="file" data-file="param.file" /> 

file direktif:

app.directive('file', function(){ 
    return { 
    scope: { 
     file: '=' 
    }, 
    link: function(scope, el, attrs){ 
     el.bind('change', function(event){ 
     var files = event.target.files; 
     var file = files[0]; 
     scope.file = file ? file.name : undefined; 
     scope.$apply(); 
     }); 
    } 
    }; 
}); 

Bu şekilde, ben yapabilirsiniz: Bir görünümde

, bir yönerge dosyası denilen ( http://angularjstutorial.blogspot.fr/2012/12/angularjs-with-input-file-directive.html kaynağı) ile, basit bir dosya girişi oluşturduk Kullanıcı bir dosya seçtiğinde al. Maalesef sadece dosya adını alıyorum.

Ben (kaynak: parsing CSV in Javascript and AngularJS): i Bu filtre sayesinde ayıracağız bir dize, içinde csv ayrıştırmak istiyorum

app.filter('csvToObj',function(){ 
    return function(input){ 
    var rows=input.split('\n'); 
    var obj=[]; 
    angular.forEach(rows,function(val){ 
     var o=val.split(';'); 
     obj.push({ 
     designation:o[1], 
     ... 
     km:o[11] 
     }); 
    }); 
    return obj; 
    }; 
}); 

nasıl sağladığı csv dosyasında veri alabilir dosya adı yerine girdi?

Şimdiden teşekkürler.

cevap

14

Tamam, dosyaları yüklemek için varolan modülleri arayarak çözümü buldum. Birini ilgilendirirse, onu buraya gönderirim. yönergesi şimdi

<input type="file" file-change="handler($event,files)" ng-model="MyFiles" /> 

:

kontrolörü olarak
app.directive('fileChange',['$parse', function($parse){ 
    return{ 
    require:'ngModel', 
    restrict:'A', 
    link:function($scope,element,attrs,ngModel){ 
     var attrHandler=$parse(attrs['fileChange']); 
     var handler=function(e){ 
     $scope.$apply(function(){ 
      attrHandler($scope,{$event:e,files:e.target.files}); 
     }); 
     }; 
     element[0].addEventListener('change',handler,false); 
    } 
    } 
}]); 

($ filtresi eklemek unutmayın görünümünde

, ben olayı tetiklemek için direktifini değiştirdik Kullanmak isterseniz, denetleyicide):

$scope.MyFiles=[]; 

$scope.handler=function(e,files){ 
    var reader=new FileReader(); 
    reader.onload=function(e){ 
     var string=reader.result; 
     var obj=$filter('csvToObj')(string); 
     //do what you want with obj ! 
    } 
    reader.readAsText(files[0]); 
} 

Filtre hala aynı (ro ws dizisi benim csv dosyalarının başlığını almadı).

+0

FileReader burada nedir? Bunu açıklar mısınız? –

+0

FileReader, dosyaları okuyabileceğiniz bir HTML5 API'sıdır. – aknorw

+0

Bana çok yardımcı oldu. Lütfen herkese yardımcı olan doğru csvToObj filtresini de yazınız. –