CSV quotes and DATA
BlitzPlus Forums/BlitzPlus Beginners Area/CSV quotes and DATA
| ||
| Hello to all. Sorry this is not really a Blitz problem, but maybe someone can help. I'm making a quiz game and I want to export a lot of Excel data to CSV and ultimately make it a DATA statement, but because 90% of the CSV file is strings, I need each entry to have "quotes" around it and wondered if anyone knew a fast way to do this? Ive tried doing a Search and replace, e.g. replace the commas with "," but this gets messy because many of the strings contain commas and the last part of the data contains numbers which I dont want as strings. Here's an example... I have this in CSV: This is a question,answer1,answer2,1,2 and I want: Data "This is a question","answer1","answer2",1,2 I just want to avoid going through it line by line if possible. Any help greatly appreciated. |
| ||
| do you have access to perl? I think you can get it for free its an open source product perl is great at doing this kind of stuff, if you do I can write the script for you. |
| ||
| also if you wanted to use blizplus I think what you are trying to do is very similiar to the example posted here in the documentation section for removing tabs (except you are adding quotes) Function StripTabs$(cl$) pos=0 Repeat pos=pos+1 istab=0 l$=Left$(cl$,1) If Asc(l$)=9 Or Asc(l$)=32 istab=1 cl$=Right$(cl$,Len(cl$)-1) End If Until istab=0 Return Trim$(cl$) End Function |
| ||
| Yes, I would do it in the same way, only I would use Instr to find the comma's. I don't think it matters if you quote the numeric values too though: you can still read them as integers. |
| ||
Assuming there are no stray spaces...newLine$ = chr$(34) + Replace(oldLine$, ",", chr$(34) + ", " + chr$(34)) + chr$(34) newLine$ = "Data " + Replace(newLine$, chr$(34) + chr$(34), chr$(34))?? |
| ||
| Thanks very much for the suggestions guys! Bryan970, I do have access to Perl (if memory serves me correctly), but I will try the examples posted first. :) b32 and Yan, thanks for your code snippets, I can see the potential and will give it a try. Paulo |
| ||
| Here's another way to go about it. It's a function from the code archives http://www.blitzbasic.com/codearcs/codearcs.php?code=1922 ;Parse string function demo
; By:Andy Amaya
;Date:2007.02.11
;Purpose for parse$() function:
; To allow user to extract words or groups of symbols using
; the delimiter best suited to the task at hand.
crLf$ = Chr$(13)+Chr$(10)
separator$ = crLf$+"==========================================================="+crLf$
;===================================================
;Parse string using the "comma" character
; Possible Use: read data in comma separated value file
;===================================================
Print "...separating CSV fields"
For x = 1 To 5
Print parse$("This is a question,answer1,answer2,1,2",x,",")
Next
Print separator$
Print "Creating data statement(s)..."+crLf$
lineOfData$ = "Data "
For x = 1 To 5
If x < 4 Then
lineOfData$ = lineOfData$ + Chr$(34) + parse$("This is a question,answer1,answer2,1,2",x,",") + Chr$(34) + ","
Else
lineOfData$ = lineOfData$ + parse$("This is a question,answer1,answer2,1,2",x,",") + ","
End If
Next
lineLen = Len(lineOfData$)
lineOfData$ = Left$(lineOfData$,lineLen-1)
Print lineOfData$
Print separator$
a$ = Input("Press [ENTER] to Exit.")
End
Function parse$(string2Chk$, n, delimiter$=" ")
;initialize local variables
Local count% = 0
Local findDelimiter% = 0
Local position% = 1
Local current$ = ""
;'n' must be greater than zero
;otherwise exit function and return null string
If n > 0 Then
;strip leading and trailing spaces
string2Chk$ = Trim(string2Chk$)
;find the word(s)
Repeat
;first check if the delimiter occurs in string2Chk$
findDelimiter% = Instr(string2Chk$,delimiter$,position)
If findDelimiter <> 0 Then
;extract current word in string2Chk$
current$ = Mid$(string2Chk$,position,findDelimiter-position)
;word extracted; increment counter
count = count + 1
;update the start position of the next pass
position = findDelimiter + 1
;if counter is same as n then exit loop
If count = n Then findDelimiter = 0
End If
Until findDelimiter = 0
;Special Case: only one word and no delimiter(s) or last word in string2Chk$
If (count < n) And (position <= Len(string2Chk$)) Then
current$ = Mid$(string2Chk$,position, Len(string2Chk$) - position+1)
count = count + 1
;looking for word that is beyond length of string2Chk$
If count < n Then current$ = ""
End If
End If
Return current$
End Function |