2017-02-16 4 views
1

Ich habe einen großen Ordner mit großen CSV-Dateien (ca. 25.000 Dateien im Ordner und es wird weiter zunehmen), dh fast alle Dateien haben mehr Zeilen als die Zeilenbegrenzung für Excel Limit war 1 Million etwas, denke ich). Alle diese CSV-Dateien haben 5 Elemente, die in jeder Zeile durch Kommas getrennt sind, mit einer unterschiedlichen Anzahl von Zeilen (Informationen) in allen Dateien.Umgang mit einem Ordner mit großen CSV-Dateien

One CSV File: 
a1,b1,c1,d1,e1 
a2,b2,c2,d2,e2 
. 
. 
. 
a3152685,b3152685,c3152685,d3152685,e3152685 

My Reference File: 
x1,y1 
x2,y2 
x3,y3 
. 
. 
. 
x397,y397 

Ich will, muß im wesentlichen nur diese Zeilen einige zuzugreifen (etwa 400) aus jeder CSV-Datei auf der Grundlage meiner Referenzdatei. Wo immer ich das xy-Paar mit dem a-Paar in einer beliebigen CSV-Datei abgleichen kann, speichere ich die a-, b-, c-, d-, e-Zeilen mit dem Titel der CSV-Datei irgendwo anders, vorzugsweise in einer Excel-Datei, aber ich bin offen für Ideen .

Ich kann mit Matlab, Python 2.7, MS Access arbeiten (Konvertierung von CSV-Dateien in eine Datenbank-Dateien schien eine gute Idee, wenn ich nicht für jede einzelne Datei tun musste - gibt es eine Batch-Version, um es zu tun) oder MS Excel. Ich habe noch nie VBA-Sachen gemacht, aber wenn Sie eine VBA-Lösung für dieses Problem haben, bin ich auch offen dafür, das zu hören.

Lassen Sie mich wissen, wenn Sie weitere Erläuterungen benötigen, falls ich nicht klar genug bin.

+0

Sie können ADO mit Excel verwenden, um auf Textdateien zu verweisen. – Fionnuala

+0

In MATLAB oder Python ist dies trivial. Öffnen Sie die Datei, lesen Sie zeilenweise bis glücklich, speichern Sie die Daten. –

Antwort

1

Nur für den Fall, dass jemand eine Antwort benötigt, habe ich es mit MATLAB abgewickelt.

Datenspeicherfunktion in MATLAB ist, was ich gesucht habe.

ds = datastore(MyReferenceFile); 
TableExtracted = readall(ds); 

Dann war der Rest nur find(ismember) übernehmen.

Es gibt auch die Batch-Lookup-Funktion (Größe der Charge ist unter ReadSize zugewiesen) von datastore; Allerdings war es auf 20000 voreingestellt und ich denke, das war auch die Grenze. Es war zu langsam für meinen Geschmack und so griff ich auf readall zurück und es war immer noch ziemlich schnell.

1

Sie können die Grenzen Büro finden products here

Matlab für die Arbeit mit diesen großen Dateien und großen Mengen von Dateien gut sind. Version 2014 hat eine Menge Verbesserungen für diesen einführenden Datenspeicher für CSV, funktioniert jetzt auch sehr gut mit Excel-Dateien.

Werfen Sie einen Blick auf dieses Tutorial:

http://blogs.mathworks.com/loren/2014/12/03/reading-big-data-into-matlab/

Ich habe eine 3 CSV-Dateien (Datei [1-3] .csv) mit diesem:

a1,b1,c1,d1,e1 
a2,b2,c2,d2,e2 
a3,b3,c3,d3,e3 
a4,b4,c4,d4,e4 
a5,b5,c5,d5,e5 
a6,b6,c6,d6,e6 
a7,b7,c7,d7,e7 
a8,b8,c8,d8,e8 
a9,b9,c9,d9,e9 
a10,b10,c10,d10,e10 

und eine Datei VarNames für die Namen der Spalten:

ABCDE

Lassen Sie uns die Dateien lesen:

>> datafile = 'csv-files/file1.csv'; 
>> headerfile = 'csv-files/varnames.txt' 

>> fileID = fopen(headerfile); 
>> varnames = textscan(fileID,'%s'); 
>> varnames = varnames{:}; 

ds = datastore(datafile,'ReadVariableNames',false); 

>> ds.VariableNames = varnames 


ds = 

    TabularTextDatastore with properties: 

         Files: { 
          '/home/anquegi/learn/matlab/stackoverflow/csv-files/file1.csv' 
          } 
       FileEncoding: 'UTF-8' 
      ReadVariableNames: false 
       VariableNames: {'A', 'B', 'C' ... and 2 more} 

    Text Format Properties: 
      NumHeaderLines: 0 
        Delimiter: ',' 
       RowDelimiter: '\r\n' 
      TreatAsMissing: '' 
       MissingValue: NaN 

    Advanced Text Format Properties: 
      TextscanFormats: {'%q', '%q', '%q' ... and 2 more} 
     ExponentCharacters: 'eEdD' 
       CommentStyle: '' 
       Whitespace: ' \b\t' 
    MultipleDelimitersAsOne: false 

    Properties that control the table returned by preview, read, readall: 
     SelectedVariableNames: {'A', 'B', 'C' ... and 2 more} 
      SelectedFormats: {'%q', '%q', '%q' ... and 2 more} 
        ReadSize: 20000 rows 


>> preview(ds) 

ans = 

    A  B  C  D  E 
    ____ ____ ____ ____ ____ 

    'a1' 'b1' 'c1' 'd1' 'e1' 
    'a2' 'b2' 'c2' 'd2' 'e2' 
    'a3' 'b3' 'c3' 'd3' 'e3' 
    'a4' 'b4' 'c4' 'd4' 'e4' 
    'a5' 'b5' 'c5' 'd5' 'e5' 
    'a6' 'b6' 'c6' 'd6' 'e6' 
    'a7' 'b7' 'c7' 'd7' 'e7' 
    'a8' 'b8' 'c8' 'd8' 'e8' 

Wenn wir die Parameter ReadSize schauen wir nehmen ist ReadSize: 20000 Zeilen, so Matlab jedes Mal, 20000 Zeilen lesen und Sie können bearbeiten. Da die Daten gibt es nur 10 Zeilen werde ich es drei ändern:

>> ds.ReadSize=3 

ds = 

    TabularTextDatastore with properties: 

         Files: { 
          '/home/anquegi/learn/matlab/stackoverflow/csv-files/file1.csv' 
          } 
       FileEncoding: 'UTF-8' 
      ReadVariableNames: false 
       VariableNames: {'A', 'B', 'C' ... and 2 more} 

    Text Format Properties: 
      NumHeaderLines: 0 
        Delimiter: ',' 
       RowDelimiter: '\r\n' 
      TreatAsMissing: '' 
       MissingValue: NaN 

    Advanced Text Format Properties: 
      TextscanFormats: {'%q', '%q', '%q' ... and 2 more} 
     ExponentCharacters: 'eEdD' 
       CommentStyle: '' 
       Whitespace: ' \b\t' 
    MultipleDelimitersAsOne: false 

    Properties that control the table returned by preview, read, readall: 
     SelectedVariableNames: {'A', 'B', 'C' ... and 2 more} 
      SelectedFormats: {'%q', '%q', '%q' ... and 2 more} 
        ReadSize: 3 rows 

>> reset(ds) 
while hasdata(ds) 
     T = read(ds); 
     T.A 
end 

ans = 

    'a1' 
    'a2' 
    'a3' 


ans = 

    'a4' 
    'a5' 
    'a6' 


ans = 

    'a7' 
    'a8' 
    'a9' 


ans = 

    'a10' 

Dann wird die T-Variable ist eine Tabelle, die Sie es schreiben können, wo Sie wollen: beachten Sie, dass jedes Mal, wenn Sie lesen (ds) sie die Zahl bewegen die durch readsie zugewiesen Linien, kann dieser Parameter Zeilen sein, oder Dateien

>> reset(ds) 
>> T = read(ds); 
>> T 

T = 

    A  B  C  D  E 
    ____ ____ ____ ____ ____ 

    'a1' 'b1' 'c1' 'd1' 'e1' 
    'a2' 'b2' 'c2' 'd2' 'e2' 
    'a3' 'b3' 'c3' 'd3' 'e3' 

>> writetable(T,'mySpreadsheet','FileType','spreadsheet') 
>> reset(ds) 
0

diese vom Thema sein kann, aber ich denke, Sie sollten SQL Server und SSIS betrachten. Sie können problemlos alle Dateien in einem Ordner durchlaufen, alle in SQL Server laden und dann die Dateien aus dem Ordner verschieben. Wenn Sie das nächste Mal Dateien in Ihren Ordner ablegen, führen Sie den Prozess für diese neuen Dateien erneut aus. Siehe den Link unten für alle Details.

https://www.mssqltips.com/sqlservertip/2874/loop-through-flat-files-in-sql-server-integration-services/

Oder verwenden reine SQL die Arbeit zu tun.

--BULK INSERT MULTIPLE FILES From a Folder 

--a table to loop thru filenames drop table ALLFILENAMES 
CREATE TABLE ALLFILENAMES(WHICHPATH VARCHAR(255),WHICHFILE varchar(255)) 

--some variables 
declare @filename varchar(255), 
     @path  varchar(255), 
     @sql  varchar(8000), 
     @cmd  varchar(1000) 


--get the list of files to process: 
SET @path = 'C:\Dump\' 
SET @cmd = 'dir ' + @path + '*.csv /b' 
INSERT INTO ALLFILENAMES(WHICHFILE) 
EXEC Master..xp_cmdShell @cmd 
UPDATE ALLFILENAMES SET WHICHPATH = @path where WHICHPATH is null 


--cursor loop 
declare c1 cursor for SELECT WHICHPATH,WHICHFILE FROM ALLFILENAMES where WHICHFILE like '%.csv%' 
open c1 
fetch next from c1 into @path,@filename 
While @@fetch_status <> -1 
    begin 
    --bulk insert won't take a variable name, so make a sql and execute it instead: 
    set @sql = 'BULK INSERT Temp FROM ''' + @path + @filename + ''' ' 
     + '  WITH ( 
       FIELDTERMINATOR = '','', 
       ROWTERMINATOR = ''\n'', 
       FIRSTROW = 2 
      ) ' 
print @sql 
exec (@sql) 

    fetch next from c1 into @path,@filename 
    end 
close c1 
deallocate c1 


--Extras 

--delete from ALLFILENAMES where WHICHFILE is NULL 
--select * from ALLFILENAMES 
--drop table ALLFILENAMES 

Von hier aus:

Import Multiple CSV Files to SQL Server from a Folder

Access wird diese Menge von Datum nicht umgehen, und wie Sie bereits wissen, wird Excel nicht einmal nahe kommen.

Noch eine Sache zu betrachten ist, R zu verwenden, das völlig frei und sehr schnell ist.

Wir begegnen oft Situationen, in denen wir Daten in mehreren Dateien, auf verschiedenen Frequenzen und auf verschiedenen Teilmengen von Beobachtungen haben, aber wir möchten sie so vollständig und systematisch wie möglich aufeinander abstimmen. In R ist der Befehl merge() eine gute Möglichkeit, zwei Datenframes zusammenzuführen.

Nur die beiden Datenrahmen in R

mydata1 = read.csv(path1, header=T) 
mydata2 = read.csv(path2, header=T) 

Dann fusionieren

myfulldata = merge(mydata1, mydata2) 

Solange mydata1 und mydata2 mindestens eine gemeinsame Spalte mit einem identischen Namen gelesen (das ermöglicht Beobachtungen passende In mydata1 zu Beobachtungen in mydata2) wird dies wie ein Zauber wirken. Es dauert auch drei Zeilen.

Was ist, wenn ich 20 Dateien mit Daten habe, die ich Beobachtung-zur-Beobachtung zuordnen möchte? Angenommen, sie haben alle eine gemeinsame Spalte, die das Zusammenführen ermöglicht, müsste ich immer noch 20 Dateien in (20 Zeilen Code) lesen und merge() arbeitet paarweise ... also könnte ich die 20 Datenrahmen zusammen mit 19 Zusammenführungs-Anweisungen zusammenführen wie folgt:

mytempdata = merge(mydata1, mydata2) 
mytempdata = merge(mytempdata, mydata3) 
. 
. 
. 
mytempdata = merge(mytempdata, mydata20) 

Das ist mühsam. Sie suchen vielleicht nach einem einfacheren Weg. Wenn Sie sind, habe ich eine Funktion, um Ihre Leiden genannt multmerge() zu lösen * Hier ist der Code, um die Funktion zu definieren.

multmerge = function(mypath){ 
filenames=list.files(path=mypath, full.names=TRUE) 
datalist = lapply(filenames, function(x){read.csv(file=x,header=T)}) 
Reduce(function(x,y) {merge(x,y)}, datalist) 

Nach Ausführen des Codes die Funktion zu definieren, Sie sind alle gesetzt, es zu benutzen. Die Funktion nimmt einen Pfad. Dieser Pfad sollte der Name eines Ordners sein, der alle Dateien enthält, die Sie zusammen lesen und zusammenführen möchten, und nur die Dateien, die Sie zusammenführen möchten. In diesem Sinne habe ich zwei Tipps:

Bevor Sie diese Funktion verwenden, ist mein Vorschlag, einen neuen Ordner in einem kurzen Verzeichnis (z. B. den Pfad für diesen Ordner könnte "C: // R// merge ") und speichern Sie alle Dateien, die Sie in diesem Ordner zusammenführen möchten. Stellen Sie außerdem sicher, dass die Spalte, die den Abgleich durchführt, auf die gleiche Weise (und mit demselben Namen) in jeder der Dateien formatiert ist. Angenommen, Sie haben Ihre 20 Dateien im Mergeme-Ordner unter "C: // R // mergeme" gespeichert und möchten sie lesen und zusammenführen. In meiner Funktion zu verwenden, verwenden Sie die folgende Syntax:

mymergeddata = multmerge(“C://R//mergeme”) 

Nachdem dieser Befehl ausgeführt wird, haben Sie einen voll integrierten Datenrahmen mit allen Ihren Variablen aufeinander abgestimmt. Natürlich hängen die meisten Details beim Zusammenführen und Zusammenführen von Daten davon ab, sicherzustellen, dass die allgemeine Spalte korrekt angegeben ist, aber da diese Funktion Ihnen viel Tipparbeit ersparen kann.

Sobald alles in 1 Datenrahmen zusammengeführt ist, exportieren Sie das in eine Textdatei oder eine CSV-Datei und laden Sie diese in SQL Server.

Verwandte Themen