Reproduzierbare Forschung: Konvertieren von sas7bdat-Dateien in CSV-Dateien durch Aufruf von statTransfer mit GNU make

FRAGE:

Ich bin sehr neu in GNU Make. Gibt es eine bessere Möglichkeit, statistische Datensätze von sas7bdat in CSV-Dateien zu konvertieren und sie mit GNU Make synchron zu halten, um reproduzierbare Forschung zu fördern? Würden Sie dieses Problem anders aus der Perspektive der Kodierung angehen oder gibt es eine bessere Möglichkeit, reproduzierbare Forschung zu fördern? Kann ich eine zusätzliche Voraussetzung hinzufügen (z. B. statTransferOptions.txt ), während statische Musterregeln verwendet werden?

Die Lösung muss:

  • Find all sas7bdat files in all subdirectories
  • Read statTransfer options
  • Convert the sas7bdat file to csv file using statTransfer command line tool with options
  • Given the current limitations of statTransfer, I think this will require a two step process:
    • Build statTransfer command file (.stcmd) for each SAS data file (.sas7bdat)
    • Build csv file for each stcmd file by executing statTransfer (st) using options in stcmd file
    • target stcmd and csv files should reside in same subdirectory as pre-requisite sas7bdat file
    • Find out-of-date stcmd and csv files and update them if a new sas7bdat file exists or if base option file changes

KONTEXT:

Ich habe einen großen statistischen Bericht geerbt, der jährlich veröffentlicht wird. In früheren Jahren wurde die Analyse in SAS durchgeführt. Wir verwenden jetzt R. Einige der vom SAS Enterprise Guide generierten sas7bdat-Dateien werden nicht korrekt mit sas7bdat Paket . StatTransfer, ein kommerzielles Produkt, verfügt über eine Befehlszeilenschnittstelle und konvertiert sas7bdat-Dateien ordnungsgemäß in CSV-Dateien. Es gibt jedoch Optionen, die die Konvertierung verbessern (z. B. das Schreiben von Datumsformaten). Die sas7bdat-Dateien befinden sich in mehreren Unterverzeichnissen, die dem Dateityp und dem Jahr entsprechen.

Dieser Ansatz wurde weiter angeregt durch:

Gandrud, Christopher (2013-06-21). Reproducible Research with R and RStudio (Chapman & Hall/CRC The R Series) (pp. 104-105). Chapman and Hall/CRC. Kindle Edition.

FEHLERBEHEBUNG:

EMPFOHLENE MAKEFILE?

RDIR := .

######
#PREP#
######
# Use BASH shell to create list of source sas7bdat files
SASDATA = $(shell find $(RDIR) -type f -name '*.sas7bdat')

# Use pattern substring functions to define variable list of filenames
# to be used as targets in recipes
STCMD_OUT = $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.stcmd, $(SASDATA))
CSV_OUT = $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.csv, $(SASDATA))

#########
#TARGETS#
#########

all: $(STCMD_OUT) $(CSV_OUT)

# I think the name "static pattern rules" is misleading
# but I found this to be helpful:
# http://www.gnu.org/software/make/manual/make.html#Static-Pattern

# can I add statTransferOptions.txt as a pre-requisite while using static pattern rules?

$(STCMD_OUT): $(RDIR)/$(@D)/%.stcmd: $(RDIR)/$(@D)/%.sas7bdat
    cp $(RDIR)/statTransferOptions.txt [email protected]
    echo copy $(RDIR)/$< delim $(RDIR)/$(basename $<).csv -v >> [email protected]
    echo quit >> [email protected]

$(CSV_OUT): $(RDIR)/$(@D)/%.csv: $(RDIR)/$(@D)/%.stcmd
    st $(RDIR)/$<

clean:
    rm $(STCMD_OUT)
    rm $(CSV_OUT)

ÜBERARBEITET MAKEFILE NACH EINGABE VON SO:

RDIR := .

######
#PREP#
######
# Create list of source sas7bdat files
SASDATA := $(shell find $(RDIR) -type f -name '*.sas7bdat')

STCMD_OUT := $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.stcmd, $(SASDATA))
CSV_OUT := $(patsubst $(RDIR)/%.sas7bdat, $(RDIR)/%.csv, $(SASDATA))

#########
#TARGETS#
#########

all: $(STCMD_OUT) $(CSV_OUT)

$(STCMD_OUT): %.stcmd: %.sas7bdat statTransferOptions.txt
    cp $(RDIR)/statTransferOptions.txt [email protected]
    echo copy $(RDIR)/$< delim $(RDIR)/$(basename $<).csv -v -y >> [email protected]
    echo quit >> [email protected]

$(CSV_OUT): %.csv: %.stcmd
    st $(RDIR)/$<

clean:
    rm $(STCMD_OUT)
    rm $(CSV_OUT)

Die korrekte Option könnte jedoch sein, das CRAN sas7bdat-Paket zu debuggen, so dass die gesamte Toolchain verfügbar ist, anstatt den proprietären statTransfer aufzurufen.

0
Unglücklicherweise nicht. Das Paket funktioniert mit anderen sas7bdat-Dateien und die fehlgeschlagenen Dateien sind groß (> 100 MB) und verfügen über proprietäre Informationen, die nicht freigegeben werden können.
hinzugefügt der Autor penguinv22, Quelle
@Thomas, stimme ich zu. Nachdem der Bericht, an dem ich gerade arbeite, beendet ist, muss ich noch einmal auf das Problem zurückkommen, warum die Konvertierung mit dem sas7bdat-Paket fehlgeschlagen ist (abgebrochen nach stundenlanger Ausführung auf einem i7 mit 16 GB RAM). Es schien ein entmutigender Prozess zu sein, um es auf ein minimales reproduzierbares Beispiel herunterzudestillieren, das ich mit dem Paketbetreuer teilen konnte.
hinzugefügt der Autor penguinv22, Quelle
Haben Sie den Importfehler des Betreuers von sas7bdat mit einer Beispiel-sas-Datei gemeldet?
hinzugefügt der Autor Spacedman, Quelle
Wenn es um die Struktur der Daten geht (und nicht um die reine Größe), dann könnte es leicht sein, eine kleine Datei zu erstellen, die auf die gleiche Weise fehlschlägt. Aber das macht nichts.
hinzugefügt der Autor Spacedman, Quelle
Ich denke nicht, dass die Integration von StatTransfer in den Workflow für die Reproduktion eine gute Idee ist. Es ist proprietär und trägt somit alle damit verbundenen Nachteile. Besser die Konvertierung durchführen, das für diese Konvertierung erforderliche Skript speichern und diesen Code zusammen mit dem in einem besseren Format gespeicherten Dataset verteilen. Reproduzierbarkeit bedeutet, dass jeder die Analyse reproduzieren kann und somit StatTransfer-Limits benötigt, die ihn reproduzieren können.
hinzugefügt der Autor Thomas, Quelle

1 Antworten

In SO haben wir im Allgemeinen nicht die Zeit oder Energie (oder oft Interesse), um verwandte Artikel, Optionen, Alternativen usw. zu lesen. Es funktioniert am besten, wenn Sie einfach und klar den Code angeben, mit dem Sie Probleme haben (in diesem Fall, das Makefile, das bereitgestellt wird, damit das großartig ist), das genaue Problem, das Sie haben, einschließlich Fehlermeldungen oder falsche Ausgaben (das ist nicht offensichtlich aus Ihrer Frage), was Sie wollten geschehen, dass nicht passiert ist, weil das nicht immer klar ist, und vielleicht irgendwelche zusätzlichen Gedanken oder Richtungen, die Sie versucht haben und nicht gearbeitet haben.

Ich bin mir nicht sicher, was genau das Problem ist, aber ich sehe eine Reihe von Problemen mit Ihrem Makefile. Erstens wird dies funktionieren, ist aber sehr ineffizient:

SASDATA = $(shell find $(RDIR) -type f -name '*.sas7bdat')

Sie sollten hier die : = Form der Zuweisung verwenden. Wahrscheinlich sollten Sie es verwenden, wenn Sie STCMD_OUT und CSV_OUT ebenfalls festlegen, obwohl dies weniger kritisch ist.

Am wichtigsten ist jedoch, dass diese Regeln nicht richtig sind:

$(STCMD_OUT): $(RDIR)/$(@D)/%.stcmd: $(RDIR)/$(@D)/%.sas7bdat

Sie können keine automatischen Variablen wie $ @ (oder eines ihrer alternativen Formulare) in den Ziel- oder Vorbereitungslisten verwenden. Die automatischen Variablen werden nur im Rezept der Regel definiert. Sie können dafür eine sekundäre Erweiterung verwenden, aber ich bin mir nicht sicher, warum Sie das versuchen. Warum nicht einfach benutzen:

$(STCMD_OUT): %.stcmd: %.sas7bdat

? Dito für die andere statische Musterregel?

Wie für Ihre Frage, ja, es ist völlig in Ordnung, zusätzliche Voraussetzungen wie statTransferOptions.txt zur statischen Musterregel hinzuzufügen.

0
hinzugefügt
Ich habe diesen Makefile fast zwei Tage lang gekämpft und wollte meine Erkundungen teilen und Feedback bekommen. Von einer früheren Version dachte ich mir, dass ich mir beigebracht habe, dass $ (STCMD_OUT):% .stcmd:% .sas7bdat entweder die Abhängigkeit nicht findet oder das Ziel im Basisverzeichnis und nicht im selben Verzeichnis ablegt Verzeichnis als die sas7bdat Datei; Ich habe jedoch Ihre Lösung versucht und es funktioniert. Vielen Dank.
hinzugefügt der Autor penguinv22, Quelle
Gemäß dem Kommentar von @MadScientist scheint das Folgende zu funktionieren und führt das Rezept aus, wenn die Basisoptionsdatei aktualisiert wird: $ (STCMD_OUT):% .stcmd:% .sas7bdat statTransferOptions.txt
hinzugefügt der Autor penguinv22, Quelle