21.10.2009Brainfucked Logo

++++++++++[>++++++++++<-]>——-<++++++++++[»+++++++++++++«-]\ »———«+++++[»>++++++++++«<-]»>—-«<++++++++++[»»+++««-]\ »»++>+++++++++++++««<++++[»»»++++++++++«««-]»»»++++«.»\ [««<.»»>-]<.«<.«++[»»»+++++«««-]»»»[«.»-][-]«««++\ [»»»++++«««-]»»»-[««<.»»>-][-]«««++[»»»++++++++++«««-]\ »»»-[«.»-]««<….»>….«.»>.«<.»…»[-]«««++++++++++\ [»»»++++++++++«««-]»»»—.[-]«««++++++++++[»»»++++++++++++«««-]\ »»»+.«….<.>…….<.<.»….<.«—-.+++..»>……..<.>….\ <.<.»..«.»>.«<.»..»[-]«««++++++++[»»»++++++++++«««-]»»»-.\ [-]«««++++++++++[»»»++++++++++«««-]»»».+++++.«…<.«……»>.\ <.>.«.»…<.>…<.«—-.+++..»>….<.«…»>.<.>.«.»..«.»>.«<.».»\ [-]«««+++++[»»»++++++++++«««-]»»».—..++++.«..«.»…….«.»..\ «.»..«.<—-.+++..».>…<.«—-.+++»>..«.»….«.»..«.»..«.»>.«<.\ »…….«.»…«<.»>…«.»..«.»..«.».«<.»>.«<—-.+++..».>.<.>..«.\ »….«.»..«.»..«.»>.«<.»…….«.»..«.».«.»..«.»..«.»..«.».\ «<.>.»…«<—-.+++».>…«.»….«.»..«.»..«.»>.«<.»…….«.»\ …….«.»..«.»..«.»….«<..».>….«.»….«.»..«.»..«.»>.«<.»\ …….«.»…….«.».<.>…«.».«<..».>…….«.»….«.».<.>…«.»>.\ «<.»…….«.<…….>.>.>….«.>.>……….«.<….>.>.>….«.»>.«<.»»\ [-]«««++++[»»»++++++++++«««-]»»»++++[««<.»»>-]««.

Nice isn’t it?\ \ Well, but you’re asking what this is all? I will give you the related links as soon as my link-system is working. For now this little explanation should help you, otherwise google for “Brainfuck tutorial”.\ \ Brainfuck is a very small (esoteric) programming language. It was design by a Swiss guy with the aim to write the smallest possible compiler for a Turing-complete language (his size is about 240 bytes).\ \ And sure Brainfuck is Turing-complete.\ \ The context of the language is a large array with (depending on the compiler and/or interpreter) about 30’000 array cells (each cell will be initalized with 0).\ \ The 8 instructions:\ > change the pointer to the next cell\ < change the pointer to the last cell\ + increment the cell value\ - decrement the cell value\ [ begin of loop\ ] end of loop (a loop stops is the value of the actual cell is 0)\ , read a value (input) into the actual cell\ . Print out the ascii sign belonging to the cell value\ \ Depending on that I will print you my bf-code of above again, this time with comments and so on:

 ____________________________________________|          ________                   ____   ||   by    /        /|    /\__        /    /| ||  Odi   /_______ / |   /   /\__    /___ / | || 2004  |         | |  |\__/   /\  |    |  | ||       |    _    | |  | _ \__/ /  |    |  | ||       |   | |   | |  | _|   \/   |    |  | ||       |         | |  |    __/    |    |  | ||       |         | /  | __/       |    | /  ||       |________ |/   |/          |____|/   |                      |____________________________________________|                                

Brainfuck Pendant (commentent):

FIRST PLACE IS THE FILL IN COUNTER PLACE\ \ ++++++++++[>++++++++++<-]>——- = 95 in 2nd place (ASCII for “_”) (pos:2)\ <++++++++++[»+++++++++++++«-]»——— = “|” (124) in 3th place (pos:3)\ «+++++[»>++++++++++«<-]»>—- = “/” (47) in 4th place (pos:4)\ «<++++++++++[»»+++««-]»»++ = SPACE (32) in 5th place (pos:5)\ >+++++++++++++ = “New Line” (13) in 6th place (pos:6)\ ««<++++[»»»++++++++++«««-]»»»++++ = 44 in 7th place (times to repeat “_”) Use as Counter place (pos:7)\ \ \ //START Line 1\ «. = Print SPACE at the beginning of line 1 (pos:5)\  » = Change Pointer to 7 (pos:7)\ [««<.»»>-] = Print 44 times “_” (pos:7)\ <. = Change to 6th place and print NewLine (pos:6)\ //END Line 1\ \ //START Line 2\ «<. = Change to 3th place; print “|” (pos:3)\ «++[»»»+++++«««-]»»» = Fill Counter with 10 (pos:7)\ [«.»-] = print 10 SPACE (pos:7)\ [-] = Clean 7th place to 0 (pos:7)\ «««++[»»»++++«««-]»»»- = Set counter place to 7 (pos:7)\ [««<.»»>-] = Print 8 “_” (pos:7)\ [-] = Clean 7th place to 0 (pos:7)\ «««++[»»»++++++++++«««-]»»»- = Set counter place to 19 (pos:7)\ [«.»-] = Print 19 SPACE (pos:7) \ ««<…. = Change to 2nd place; print 4 “_” (pos:2)\ »>…. = Change to 5th place: print 4 SPACE (pos:5)\ «. = Change to 3rd place: print “|” (pos:3)\ »>. = Change to 6th place: print NewLine (pos:6)\ //END Line 2\ \ \ //START Line 3\ «<. = Change to 3rd place; print “|” (pos:3)\ »… = Change to 5th place; print 3 SPACE (pos:5)\  »[-] = Clean 7th place (pos:7)\ «««  = Change pointer to 1 (pos:1)\ ++++++++++[»»»++++++++++«««-]»»»—. = Set 7th position to 98 (stands for “b”) and print it (pos:7)\ [-] = Clean 7th place (pos:7)\ «««  = Change pointer to 1 (pos:1)\ ++++++++++[»»»++++++++++++«««-]»»»+. = Set 7th position to 121 (stands for “y”) and print it (pos:7)\ «…. = Change to 5th place; print 4 SPACE (pos:5)\ <. = Change to 4th place; print “/” (pos:4)\ >……. = Print 8x SPACE (pos:5)\ <. = Print “/” (pos:4)\ <. = Print “|” (pos:3)\ »…. = Print 4 SPACE (pos:5)\ <. = Print “/” (pos:4)\ «—-. = Print “" (_{95} minus 3 = \{92}) (pos:2)\ +++.. = Print 2 “_” (pos:2)\ »>…….. = Print 8x SPACE (pos:5)\ <. = Print / (pos:4)\ >…. = Print 3 times SPACE (pos:5)\ <. = Print “/” (pos:4)\ <. = Print “|” (pos:3)\  ».. = Print SPACE (pos:5)\ «. = Print “|” (pos:3)\ »>. = Print NewLine (pos:6)\ //END Line 3\ \ //START Line 4\ «<. = Change to 3rd place; print “|” (pos:3)\  ».. = Change to 5th place; print 3 SPACE (pos:5)\  »[-] = Clean 7th place (pos:7)\ «««  = Change pointer to 1 (pos:1)\ ++++++++[»»»++++++++++«««-]»»»-. = Set 7th position to 79 (stands for “O”) and print it (pos:7)\ [-] = Clean 7th place (pos:7)\ «««  = Change pointer to 1 (pos:1)\ ++++++++++[»»»++++++++++«««-]»»». = Set 7th position to 100 (stands for “d”) and print it (pos:7)\ +++++. = Set 7th place to 105 (stands for “i) (pos:7)\ «… = Print 3 SPACE (pos:5)\ <. = print “/” (pos:4)\ «…… = Print 5 “_” (pos:2)\ »>. = Print a SPACE (pos:5)\ <. = Print “/” (pos:4)\ >. = Print SPACE (pos:5)\ «. = Print “|” (pos:3)\ »… = Print 3 SPACE (pos:5)\ <. = Print “/” (pos:4)\ >… = Print 3 SPACE (pos:5)\ <. = Print “/” (pos:4)\ «—-.+++ = Print “" (decrease “_” about 3 back to the orgin) (pos:2)\ .. = Print 2 “_” (pos:2)\ »>…. = Print 4 SPACE (pos:5)\ <. = Print a “/” (pos:4)\ «… = Print 2 “_” (pos:2)\ »>. = Print a SPACE (pos:5)\ <. = Print a “/” (pos:4)\ >. = Print a SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print SPACE (pos:5)\ «. = Print “|” (pos:3)\ »>. = Print NewLine (pos:6)\ //END Line 4\ \ //START Line 5\ «<. = Change to 3rd place; print “|” (pos:3)\  ». = Change to 5th place; print 3 SPACE (pos:5)\  »[-] = Clean 7th place (pos:7)\ «««  = change position to 1 (pos:1)\ +++++[»»»++++++++++«««-]»»». = Print “2” (50) (pos:7)\ —.. = Print 2x “0” (48) (pos:7)\ ++++. = Print “4” (52) (pos:7)\ «.. = Print 2 SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »……. = Print 9x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print a SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ <—-.+++ = Print a “" (pos:2)\ .. = Print 2x “_” (pos:2)\  ». = Print a “/” (pos:4)\ >… = Print 3x SPACE (pos:5)\ <. = Print a “/” (pos:4)\ «—-.+++ = Print a “" (pos:2)\ »>.. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »…. = Print 4x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »>. = Print NewLine (pos:6)\ //END Line 5\ \ //START Line 6\ «<. = Change to 3rd place; print “|” (pos:3)\ »……. = Change to 5th place; print 7x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »… = Print 3x SPACE (pos:5)\ «<. = Print a “_” (pos:2)\ »>… = Print 3x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print a SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ». = Print a SPACE (pos:5)\ «<. = Print a “_” (pos:2)\ »>. = Print a SPACE (pos:5)\ «<—-.+++ = Print a “" (pos:2)\ .. = Print 2x “_” (pos:2)\  ». = Print a “/” (pos:4)\ >. = Print a SPACE (pos:5)\ <. = Print a “/” (pos:4)\ >.. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »…. = Print 4x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »>. = Print NewLine (pos:6)\ //END Line 6\ \ //START Line 7\ «<. = Change to 3rd place; print “|” (pos:3)\ »……. = Change to 5th place; print 7x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ». = Print a SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print a SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ». = Print a SPACE (pos:5)\ «<. = Print a “_” (pos:2)\ >. = Print a “|” (pos:3)\ »… = Print 3x SPACE (pos:5)\ «<—-.+++ = Print a “" (pos:2)\  ». = Print a “/” (pos:4)\ >… = Print 3x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »…. = Print 4x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »>. = Print NewLine (pos:6)\ //END Line 7\ \ //START Line 8\ «<. = Change to 3rd place; print “|” (pos:3)\ »……. = Change to 5th place; print 7x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »……. = Print 7x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print a SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »…. = Print 4x SPACE (pos:5)\ «<.. = Print 2x “_” (pos2)\  ». = Print a “/” (pos:4)\ >…. = Print 4x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »…. = Print 4x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ».. = Print 2x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »>. = Print NewLine (pos:6)\ //END Line 8\ \ //START Line 9\ «<. = Change to 3rd place; print “|” (pos:3)\ »……. = Change to 5th place; print 7x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »……. = Print 7x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ». = Print a SPACE (pos:5)\ <. = Print a “/” (pos:4)\ >… = Print 3x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ». = Print a SPACE (pos:5)\ «<.. = Print 2x “_” (pos2)\  ». = Print a “/” (pos:4)\ >……. = Print 7x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »…. = Print 4x SPACE (pos:5)\ «. = Print a “|” (pos:3)\  ». = Print a SPACE (pos:5)\ <. = Print a “/” (pos:4)\ >… = Print 3x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »>. = Print NewLine (pos:6)\ //END Line 9\ \ //START Line 10\ «<. = Change to 3rd place; print “|” (pos:3)\ »……. = Change to 5th place; print 7x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ <……. = Print 7x “_” (pos:2)\ >. = Print a “|” (pos:3)\ >. = Print a “/” (pos:4)\ >…. = Print 4x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ >. = Print a “/” (pos:4)\ >………. = Print 10x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ <…. = Print 4x “_” (pos:2)\ >. = Print a “|” (pos:3)\ >. = Print a “/” (pos:4)\ >…. = Print 4x SPACE (pos:5)\ «. = Print a “|” (pos:3)\ »>. = Print NewLine (pos:6)\ //END Line 10\ \ //START Line 11\ «<. = Change to 3rd place; print “|” (pos:3)\ »»[-] = Clean 7th place (pos:7)\ «««++++[»»»++++++++++«««-]»»»++++ = 44 in 7th place (times to repeat “_”) Use as Counter place (pos:7)\ [««<.»»>-] = Print 44 times “_” (pos:7)\ ««. = Change to 3rd place and print “|” (pos:3)\ //END Line 11

Brainfucked wishes

08.10.2009Ein Tisch ist ein Tisch

Nach einem Text vom Peter Bichsel, im Stile von “Kunst aufräumen” ordne ich mal Bichsels Text neu.

Orginal Text: http://www.yolanthe.de/stories/bichsel01.htm

Nomen

  Mann        Menschen
  Bild        Bett
  Wecker      Stuhl
  Teppich     Tisch
  Bett        Zeitung
  Stuhl       Spiegel
  Fotoalbum   Wecker
  Zeitung     Schrank
  Schrank     Teppich
  Spiegel     Fotoalbum
  Fuss        Mann
  Morgen      Fuss
  Mann        Morgen

Verben

  stellen    läuten
  schauen    frieren
  läuten     liegen
  frieren    stehen
  blättern   stellen

08.10.2009Papier - Zum Tragen kein Problem

Wenn ich eine Tüte für mein Brötchen bekomme finde ich es immer angenehm, dass die auch halten.

Eine normale Tüte, aber…

DAS ist wichtig!

In dem Sinne: trägt euch sorge, denn es ist gut.

24.08.2007MS Access: Let lines in Reports grow with it's content

The problem is the following: You create a report with MS Access with a text field. To display the whole text, you have to set the “CanGrow” property to “Yes” (on the section and on the text-field). When running the report that has vertical lines as column seperator you have an ungly effect: The line keeps its size, as this has been fixed in the design view.

One might think that the easy solution is to adjust this length at runtime. First of all I need to declare what “runtime” means. As this problem occures in every “Detail”-Section we must dive in the events a section provides. There are three of them “OnRetreat”, “OnFormat” and “OnPrint” (apart all the mouse events, which are defenitly not suitable).

The Retreat-Event occurs “when Microsoft Access returns to a previous report section during report formatting” (Source: VBA Help). Not exactly what we’re looking for.

The Format-Event occurs “when Microsoft Access determines which data belongs in a report section, but before Access formats the section for previewing or printing”. It sounds good, but at this point we don’t have our data in the section and are therefore unable to determine the correct height.

Finally the Print-Event “after data in a report section is formatted for printing, but before the section is printed”. Here we are, we have our data which is not yet printed. The problem is that at this point all elements are already formatted, all we can do is add new elements and that’s why we can’t just adjust the height of each line by setting it via

 Me.myLine.Height = Me.Height '''this does not work in the OnPrint event, myLine has already been formatted

The simple solution is to draw a new line and use your already placed line as a template:

Private Sub Detail_Print(Cancel As Integer, PrintCount As Integer)
    Dim EndOfLine As Double
    EndOfLine = Me.Height       ''height of section (where the line stops)

    ''becasue it's not allowed in such a late state to change lines, we draw new one's based on the old
    ''myLine
    Me.Line (Me.myLine.Left, 0)-(Me.myLine.Left, EndOfLine)

End Sub;

30.06.2007MS Access and not updatable Recordsets

The whole thing is just plain stupid: Someone in the department I work in has created an MS Access Database to track our customers. Above this application are some forms to insert the data. Now we already have much of the data in various excel sheets etc. So my task was to write a function (or method or sub or whatever you call it in your world) to get some values from an excel sheet and insert it to a form, just like a user would do it. Like that the user has the possibility to check and change the data before it gets saved in the database. Now if you bind the form elements to parts of a query, Access gets your data as a so called snapshot via MS Jet (your communication channel to the DB). Snapshot data is not updateable, so if you try to assign your own values to form elements an error message pops up and that’s it.

My first solution was to ignore that fact and simply update my data directly to the database. But then all nice features like the “undo” option (to reset a record) or the possibility to check values before they get inserted are lost. The solution I came up is simple, but you need to check your status very exact to keep a usable form.

I have a form with my data, I have a save button, I have an exit button and I have an update button. There is a special button to start the gathering of data from the excel sheet. Now If you want to change the value of a textbox on the form you need to cut the textbox off the data (ControlSource = ""), then you can freely change the value.

Now you can’t simply update the current record, because the textbox is no longer in the recordset. This means that you have to update the value directly in the database when the save button is pressed. Then reattach the ControlSource and Requery and Repaint your form.

When you want to Undo your changed, just don’t save your values in the DB and reassign the ControlSource and Refresh the form, the old value will appear.

14.05.2007Convert fixed length column to Excel

I had to convert the output from sqlplus to an excel sheet. The problem was, that I had no influence on the creation, so I could spool the file directly to excel.

All I got were spool files like that:

      CLASS_ID SUPER_CLASS_ID   COUNT(*)
============== ============== ==========
       128           8765         18
       128           8765        131
       128           8765          7

My idea was to take the line used to seperate the column titles and the data as the data that gives me the length of each column (refered as the column line in my function below). Then just simply extract a block from start to end (as given) based on the gathered column length information.

Maybe someone can use this piece of VBA code:

Public Sub convertFixed()
    Dim sFile As String
    Dim iCount As Long
    Dim iSubCount As Long
    Dim iLastCount As Long
    Dim i As Integer
    Dim Length() As Integer
    Dim sValue As String

    Dim iStart As Integer
    Dim iEnd As Integer
    Dim iColumn As Integer


    ''clear previous data
    Cells.ClearContents

    ''choose the file with the windows file dialog
    With Application.FileDialog(msoFileDialogFilePicker)
    .AllowMultiSelect = False
    .Title = "Choose log file to convert"
    .InitialFileName = ThisWorkbook.Path
    .InitialView = msoFileDialogViewDetails
    .Filters.Clear

    ''the filter is set to .log .spool and .txt files
    .Filters.Add "Log file", "*.log, *.spool, *.txt"

    .ButtonName = "Load"
    If .Show = -1 Then
        sFile = .SelectedItems(1)
    Else
        ''stop execution if no file is selected
        Exit Sub
    End If
    End With


    ''we need the following informtion (gather with InputBoxes)
    ''line to scan the column lengh (space delimiteted) -> line number
    ''begin of block (line number)
    ''end of block (line number)
    iStart = InputBox("Enter line number where block starts:", "Line number of Start")
    iEnd = InputBox("Enter line number where block ends:", "Line number of End")
    iColumn = InputBox("Enter line number of fixed length specification", "Line number for fixed length")

    ''the first loop is to get the correct column length
    'open the file
    Open sFile For Input Access Read As #1
    iCount = 1
    ''loop until end of file (EOF) is reached
    Do Until EOF(1)
    Line Input #1, sLine
    If (iCount = iColumn) Then
        ''exit if the column line (to scan the length) is reached
        Exit Do
    End If
    iCount = iCount + 1
    Loop
    ''close the file
    Close #1

    iCount = 0
    iSubCount = 1
    iLastCount = 0
    ''sLine now contains a line that gives us the fixed length of the columns
    sLine = RTrim(sLine)
    Do Until iSubCount > Len(sLine)
    If (Mid(sLine, iSubCount, 1) = " " Or iSubCount = Len(sLine)) Then
        ''the Length array stores the length of each column (needs to be ReDim'ed with each new column)
        ReDim Preserve Length(iCount)
        Length(iCount) = iSubCount - iLastCount
        iLastCount = iSubCount
        iCount = iCount + 1
    End If
    iSubCount = iSubCount + 1
    Loop

    ''open the file to extract the block based on the column length stored in the Length-Array
    Open sFile For Input Access Read As #1
    iCount = 1
    iSubCount = 1

    ''loop until the end of the block is reached
    Do Until iCount > iEnd
    Line Input #1, sLine
    iLastCount = 1
    If (iCount >= iStart) Then
        For i = 0 To UBound(Length)
            sValue = Trim(Mid(sLine, iLastCount, Length(i)))
            ''prevent application errors with adding of "'" in front of special characters
            If (Left(sValue, 1) = "=" Or Left(sValue, 1) = "-" Or Left(sValue, 1) = "+") Then
                sValue = "'" & sValue
            End If
            ''insert the data to the current Excel sheet
            Cells(iSubCount, i + 1).Value = sValue
            iLastCount = iLastCount + Length(i)
        Next i
        iSubCount = iSubCount + 1
    End If
    iCount = iCount + 1
    Loop
    ''close the file
    Close #1

End Sub

27.12.2006Excel to CSV with Python

I wanted to handle a simple task: convert a bunch of XSLs to CSVs. Well I wrote a small Script in VBScript and it worked. Then I needed to change the List separator, so I did that in my System settings, and then my Script didn’t work anymore, because it just ignored my changed settings.

I googled a lot and didn’t find the solution (only people with the same problem). It seems that VBScript (or WSH) is using it’s own locale that you can not change.

So I began to look for alternatives. Python can handle the COM interface when you install PyWin32 (the version must match the python version you’re using). So I just rebuild my script with python and it’s COM-Interface. Et voil�: it takes the user defined settings and converts my files in the way I want them.

#import win32 stuff
from win32com.client import Dispatch
#import other needed
import glob,sys,os

path = os.path.split(sys.argv[0]) #gather the path of the script
path = path[0]
path = path + '\\' #append \ at the end of path (when using *NIX you must use / instead
files = glob.glob('*.xls') #get list of files

xlApp = Dispatch("Excel.Application") #create Excel COM-Object
xlApp.DisplayAlerts = False
for file in files:
    xlWB = xlApp.Workbooks.Open(path + file)
    xlWB.SaveAs(path + file.replace(".xls",".csv"), 6 ) #6 = xlcsv
    xlWB.Close()
xlApp.Quit()
del xlApp

27.12.2006Information about Oracle Directories

I know what I write is quite newbieish, but I needed information about a directory I’ve created, means which path it’s pointing to:

select * from all_directories dir;

There simply is no userdirectories, and with allobjects I didn’t get what I wanted.

12.12.2006SQL Start-Script generator

Sometimes it’s so simple:

import glob
files = glob.glob('*.*');
f=open('start_script.sql', 'w')
f.write('PROMPT This is an automatic generated start script\n');
f.write('PROMPT\n');
f.write('SPOOL start_script.LOG\n\n');
for filename in files:
    if filename == 'start_script.sql':
        continue
    f.write('PROMPT Starting script ' + filename + '\n');
    f.write('@@' + filename + '\n');
f.write('\nPROMPT\n');
f.write('PROMPT Finished.\n');
f.write('SPOOL OFF\n');
f.close();
exit();

Explanation:

First get a file list of the current directory (glob.glob(‘.’), this won’t return you directories since they don’t have an extension, if your files doesn’t have an extension, either: your fault). Then open a file called start_script.sql which will held our start-script (pretty self-explanatory). Then we generate a “@@” line for each file (this means if you have non-SQL-files in that directory you have to clean-up your script or edit it that it only takes .sql files (tip: glob.glob(‘*.sql’)). The start-script itself is excluded but the python script will be included (can easily be made excluded as well). After the loop the file gets closed and that’s it.

07.11.2006Delete duplicate records with Orcle

Don’t ask me why I needed to do that, but I had a lot (about 14 Mio.) duplicate records in a table.

DELETE FROM our_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM our_table
GROUP BY column1, column2, column3... ;

helped me out. (thanks to www.devx.com)

Next time I write my queries to filter those out before inserting them…


enabled: