2010-07-29 13 views
8

सोच रहा था कि संरचित फ़ाइलों को सिद्धांत/सिम्फनी के लिए वाईएएमएल डेटा फिक्स्चर में परिवर्तित करना आसान है या नहीं।डाटाबेस/एक्सेल/सीएसवी से वाईएएमएल डेटा फिक्स्चर में कनवर्ट करें?

मुझे सीएसवी स्वीकार करने के लिए सिद्धांत के साथ कोई उपयोगिता दिखाई नहीं दे रही है।

मैं बस ऐसा करने के लिए कुछ आसान लिखना शुरू कर सकता हूं। क्या यह सार्थक है?

उत्तर

9

मैंने इस समस्या को हल करने के लिए अपना खुद का मैक्रो लिखा & ने इसे साझा किया। आप अपने मॉडल में फ़ील्ड निर्दिष्ट कर सकते हैं, डेटा भर सकते हैं और वाईएएमएल उत्पन्न होता है। सबसे अच्छी बात यह है कि यह नेस्टेड डाटा रूप में अच्छी तरह (NestedSet सिद्धांत व्यवहार के आधार पर)

आप यहाँ से डाउनलोड कर सकते हैं का समर्थन करता है: http://www.prasadgupte.com/go/converting-csvexcel-data-to-doctrine-yaml-fixtures/

आशा इस मदद करता है!

+0

उपवो टीएस व्यक्तिगत रूप से कोई फर्क नहीं पड़ता लेकिन यह साधकों के जवाब में आत्मविश्वास पैदा करता है। 300+ विज़िट/डाउनलोड और यहां केवल 2 अपवॉट्स .. – Prasad

3

एक त्वरित गूगल खोज इस के साथ आया था: http://code.activestate.com/recipes/546518-simple-conversion-of-excel-files-into-csv-and-yaml/

अजगर आवश्यक है, हालांकि, लेकिन यह एक समस्या नहीं होनी चाहिए। काफी आशाजनक लग रहा है और आपको वही करता है जो आपको चाहिए (ध्यान में रखते हुए कि सीएसवी फाइलों को एक्सेल के साथ एक्सेल के साथ खोला जा सकता है और .xls के रूप में सहेजा जा सकता है)

+0

धन्यवाद DrColossos, मैं था इस पर टक्कर लगी ... लेकिन पहले कभी पाइथन के साथ काम नहीं किया है - यह भी नहीं पता कि इस तरह की एक स्क्रिप्ट चलाने के लिए क्या होगा .. मैं कुछ आसान हासिल करने की कोशिश करूंगा .. और इसे यहां पोस्ट करें ... धन्यवाद – Prasad

1

यदि आप पहले से ही रूपांतरण मैक्रो का उपयोग कर रहे हैं, तो आप एक ऐसा फ़ंक्शन जोड़ सकते हैं जो CSV डेटा से एक PHP स्क्रिप्ट तैयार करेगा। तो वस्तु "पेन" की तरह के लिए एक डेटा पंक्ति: नाम टाइप कीमत

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

उत्पादन होगा:

// 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); 

यहाँ मैक्रो समारोह है:

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 
संबंधित मुद्दे