2010-07-29 10 views

Respuesta

9

Escribí mi propia macro para resolver este problema & lo compartí. Puede especificar los campos en su modelo, completar los datos y se genera el YAML. La mejor parte es que es soportes agrupados de datos, así (basado en NestedSet Comportamiento Doctrina)

Puede descargar el archivo desde aquí: http://www.prasadgupte.com/go/converting-csvexcel-data-to-doctrine-yaml-fixtures/

Espero que esto ayude!

+0

UpVo Los tes no importan personalmente, pero infunden confianza en una respuesta para los buscadores. Más de 300 visitas/descargas y solo 2 votaciones ascendentes aquí .. – Prasad

3

Una rápida búsqueda en Google se le ocurrió esto: http://code.activestate.com/recipes/546518-simple-conversion-of-excel-files-into-csv-and-yaml/

Requiere Python, pero aunque eso no debería ser un problema. Parece bastante prometedor y hace exactamente lo que necesita (teniendo en cuenta que los archivos CSV se pueden abrir con Excel como un archivo excel nativo y se guardan como .xls)

+0

gracias DrColossos, tuve se topó con esto ... pero nunca antes había trabajado con Python, ni siquiera sé lo que se necesitaría para ejecutar un script como este ... Trataré de lograr algo más simple ... y publicarlo aquí ... gracias – Prasad

1

Si ya está utilizando la macro de conversión, puede agregar una función que creará un script PHP a partir de los datos CSV. Por lo que una fila de datos para el objeto "pluma" como: nombre Precio de tipo

Pen Name, Type, Price 
"Reyballs Super Point 0.5", "Ball point", 10 
"Palkar Ink Pen", "Ink Pen", 25 

habría de salida:

// Object: Pen 
$pen1 = new Pen(); 
$pen1->name = "Reyballs Super Point 0.5"; 
$pen1->type = "Ball point"; 
$pen1->price = "10"; 
$pen1->save(); 
unset($pen1); 
$pen2 = new Pen(); 
$pen2->name = "Palkar Ink Pen"; 
$pen2->type = "Ink Pen"; 
$pen2->price = "25"; 
$pen2->save(); 
unset($pen2); 

Aquí es la función macro:

Sub GeneratePHP() 

targetSheetRow = 1 
fieldNamesRow = 3 
sourceSheetDataRow = fieldNamesRow + 1 
earlyLoopEnd = False 
counter = 0 

' do not run without active sheet 
If ActiveSheet.Name = "" Then 
MsgBox "Please call the macro from a sheet" 
End 
End If 

' identify sheets 
Set source = ActiveSheet 
' custom output sheet 
targetSheetName = source.Cells(1, 12) 

If targetSheetName = "" Or targetSheetName = "Output" Then 
targetSheetName = "Output" 
Else 
On Error GoTo RTE 
Set Target = Worksheets(targetSheetName) 
GoTo RTS 
RTE: 
'MsgBox "PG" & Err.Description, Title:=Err.Source 
targetSheetName = "Output" 
End If 

RTS: 
' clear exsiting data in Target/Output sheet 
Set Target = Worksheets(targetSheetName) 
Target.Cells.Clear 
Target.Cells.Font.Name = "Courier" 
' Get no of fields in model (assume level & key always there) 
noOfCols = 2 
Do While source.Cells(fieldNamesRow, noOfCols + 1) <> "end" 
noOfCols = noOfCols + 1 
Loop 
' If no field other than level & key, error 
If noOfCols < 3 Then 
MsgBox "No data for the records" 
End 
End If 

' print Model name 
Target.Cells(targetSheetRow, 1) = "// Object: " + source.Cells(1, 4) 
targetSheetRow = targetSheetRow + 1 
objClass = source.Cells(1, 4) 

' Loop over data rows in source sheet 
Do While source.Cells(sourceSheetDataRow, 1) <> "end" 

If source.Cells(sourceSheetDataRow, 1) = "end-loop" Then 
Target.Cells(targetSheetRow, 1) = "<?php endfor; ?>" 
targetSheetRow = targetSheetRow + 1 
earlyLoopEnd = True 
GoTo NextRow 
End If 

' rows to skip 
If source.Cells(sourceSheetDataRow, 2) = "~!~" Or source.Cells(sourceSheetDataRow, 1) = "~!~" Then 
GoTo NextRow 
End If 

' read level 
blanks = source.Cells(sourceSheetDataRow, 1) 

' print key 
counter = counter + 1 
varName = "$" + LCase(objClass) + CStr(counter) 
varDec = varName + " = new " + objClass + "();" 
Target.Cells(targetSheetRow, 1) = varDec 
targetSheetRow = targetSheetRow + 1 
spaces = spaces + " " 
spaces_count = spaces_count + 2 

' print fields when value != ~!~ 
For clNumber = 3 To noOfCols 
If CStr(source.Cells(sourceSheetDataRow, clNumber)) <> "~!~" And CStr(source.Cells(fieldNamesRow, clNumber)) <> "~!~" Then 
    Target.Cells(targetSheetRow, 1) = varName + "->" + source.Cells(fieldNamesRow, clNumber) + " = """ + CStr(source.Cells(sourceSheetDataRow, clNumber)) + """;" 
    targetSheetRow = targetSheetRow + 1 
End If 
Next clNumber 

Target.Cells(targetSheetRow, 1) = varName + "->save();" 
    targetSheetRow = targetSheetRow + 1 
Target.Cells(targetSheetRow, 1) = "unset(" + varName + ");" 
    targetSheetRow = targetSheetRow + 1 

NextRow: 
' go for next row in source sheet 
sourceSheetDataRow = sourceSheetDataRow + 1 

Loop 

' Success 
msg = "Data from sheet """ & source.Name & """ was converted to YAML on """ & targetSheetName & """ sheet" & vbCrLf & vbCrLf & "prasadgupte.com" 
MsgBox msg 
' Focus on output sheet 
Sheets(targetSheetName).Select 
Range("A1:A" & (targetSheetRow - 1)).Select 
End Sub 
Cuestiones relacionadas