Take the 2-minute tour ×
Mathematica Stack Exchange is a question and answer site for users of Mathematica. It's 100% free, no registration required.

I have a large data set that gets exported to a .csv file. Export[data,filename,"csv"] is extremely fast and formats the data in a nice JMP-friendly manner. However, now I want to append to that file. OpenAppend[filename] works, but I can't get the formatting to match what Export[data,filename,"csv"] would output.

Specifically, I'm looking for E-notation on items that require it, each line is a row in data, comma-delimited, and no quotations around strings.

Example of what I want, and what Export[] returns:

1207-6,120113AC-1,Hall,1,B=1.25,T=27.8C,1,4,369.3213,8.857323e12,1908.02,0.9990578214405423,0.9816049084772898
1207-6,120113AC-1,Hall,1,B=1.25,T=27.8C,1,5,363.3738,8.925324e12,1924.474,0.9983476963774321,0.9706588849929922
1207-6,120113AC-1,Hall,1,B=1.25,T=27.8C,1,6,363.2613,8.906686e12,1929.098,0.9991256922330654,0.986551586345846

So far, I've come relatively close with some very convoluted, annoying workaround:

StringTrim[ StringReplace[ StringTrim[ StringReplace[ ToString[ NumberForm[exportdata, NumberFormat -> (SequenceForm[#1, If[#3 == "", "", "e" <> #3]] &)]], ", " -> ","], ("{" | "}")], "},{" -> "\r"], ("{" | "}")]

This returns an output in Mathematica, that looks almost correct (missing some digits, but those aren't significant anyway):

1208-5,120113AC-3,Hall,1,B=1.25,T=28.2C,1,4,360.304,8.75973e12,1977.56,0.999515,0.993529
1208-5,120113AC-3,Hall,1,B=1.25,T=28.2C,1,5,360.74,8.72497e12,1983.04,0.997762,0.962358
1208-5,120113AC-3,Hall,1,B=1.25,T=28.2C,1,6,359.863,8.72829e12,1987.11,0.999306,0.989313

as the output, but OpenAppend[], Write[] still:

  1. doesn't add an EOL tag (LF or CR) after each row in data
  2. adds quotes around the entire line (I'm assuming because it's technically a string)

To fix #1, I've put the Write[] inside a Do[] loop. Now the only issue is the quotation marks. How can I get rid of these?

Here's the code:

str = OpenAppend["Z:\\temp.csv", PageWidth -> [Infinity], NumberMarks -> False]
Do[Write[str, StringTrim[ StringReplace[ ToString[ NumberForm[exportdata[[i]],NumberFormat -> (SequenceForm[#1, If[#3 == "", "", "e" <> #3]] &)]], ", " -> ","], ("{" | "}")]], {i, Length[exportdata]}];
Close[str]

Or, am I doing everything in a completely ass-backwards way, and there's a super simple, easy, pretty way to append to an exported .csv file and I just haven't been able to find the way with all my searching?

share|improve this question
add comment

1 Answer 1

up vote 7 down vote accepted

As @WReach has noted, Export will accept a stream as its first argument so

file = OpenAppend["out.txt"]

Export[file, data, "CSV"];
WriteString[file, "\n"];

Close[file]

Alternatively you could first use ExportString to write the data into a string in the desired format, then send the string to the file to be appended to using WriteString.

Example:

data = RandomInteger[100, {100, 3}]

file = OpenAppend["out.txt"]

string = ExportString[data, "CSV"];

WriteString[file, string]
WriteString[file, "\n"];

Close[file]
share|improve this answer
2  
Awesome, that's working wonderfully. I just had to add WriteString[str, "\n"] right before closing the file, so that the next append gets placed on the correct line. –  dthor Feb 23 '12 at 22:14
2  
+1 Note that Export will accept a stream as its first argument, so one could write Export[stream, data, "CSV"] and avoid the temporary in-memory copy of the CSV string. –  WReach Feb 24 '12 at 18:42
    
@WReach I thought I had tried this in the past and didn't work. I was wrong. I updated the answer now. Thank you! –  Szabolcs Feb 24 '12 at 19:26
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.