12
$\begingroup$

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?

$\endgroup$

1 Answer 1

11
$\begingroup$

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]
$\endgroup$
3
  • 3
    $\begingroup$ 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. $\endgroup$
    – dthor
    Commented Feb 23, 2012 at 22:14
  • 4
    $\begingroup$ +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. $\endgroup$
    – WReach
    Commented Feb 24, 2012 at 18:42
  • 2
    $\begingroup$ @WReach I thought I had tried this in the past and didn't work. I was wrong. I updated the answer now. Thank you! $\endgroup$
    – Szabolcs
    Commented Feb 24, 2012 at 19:26

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

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