【问题标题】:Exporting, Appending/Prepending data and text into files (Mathematica)将数据和文本导出、附加/附加到文件中 (Mathematica)
【发布时间】:2011-11-16 23:59:57
【问题描述】:

我正在将表“mydata1”中的数据以 CSV 格式导出到“file1.dat”中。以下是mathematica代码:

mydata1=TableForm[Flatten[
Table[Table[Table[
                 {xcord, ycord, zcord}, {xcord, 0,50,10}],
                   {ycord,0,50,10}], {zcord, 50, 100, 10}], 2]];

Export["file1.dat",mydata1,"CSV"]

现在我的“file1.dat”看起来像这样:

0,0,50
10,0,50
20,0,50
..
.. and so on

现在我有另一组来自表“mydata2”的数据(代码如下)。我希望能够将表“mydata2”中的数据存储到同一个文件“file1.dat”中。但在我这样做之前我需要在文件“file1.dat”中写一个文本,例如“下面的数据来自 mydata2”。

注意两个表中的两个数据都需要以 CSV 格式导出。

mycounter=20
mydata2=TableForm[Flatten[
Table[Table[Table[
                 {++mycounter,xcord, ycord, zcord}, {xcord, 0,50,10}],
                   {ycord,0,50,10}], {zcord, 50, 100, 10}], 2]];

最后我的数据文件“file1.dat”应该是这样的

*Data from data from mydata1
0,0,50
10,0,50
20,0,50
... and so on
*Below data from mydata2
21,0,0,50
22,10,0,50
23,20,0,50
... and so on.

如果您观察到最终数据文件“file1.dat”应该有来自“mydata1”数据下方的表“mydata2”中的数据,并且在它们之间有一些文本写入。

注意:我愿意以 CSV 格式导出扩展名为 TXT 的数据 例如:

Export["file1.txt", mydata1, "CSV"]

我使用了“PutAppend”,但它并没有给我想要的结果。要么我没有正确使用它,要么它不是我遇到的问题的关键字。

我有很多关于出口的问题,但我现在不会问所有这些,因为我不想让大家感到困惑。

【问题讨论】:

    标签: text append export wolfram-mathematica export-to-csv


    【解决方案1】:

    流可用于此目的。如果您的目标是在不同时间生成mydata1 和mydata2,那么您可以执行以下操作。首先,让我们创建包含mydata1的文件:

    $stream = OpenWrite["file.dat", BinaryFormat -> True];
    WriteString[$stream, "*Data from data from mydata1\n"]
    Export[$stream, mydata1, "CSV"]
    WriteString[$stream, "\n"]
    Close[$stream]
    

    我们可以使用Import来验证文件的内容:

    In[10]:= Import["file.dat", "Text"]
    
    Out[10]= *Data from data from mydata1
             0,0,50
             10,0,50
             20,0,50
             ...
    

    现在,让我们将mydata2 附加到文件末尾:

    $stream = OpenAppend["file.dat", BinaryFormat -> True];
    WriteString[$stream, "*Below data from mydata2\n"]
    Export[$stream, mydata2, "CSV"]
    WriteString[$stream, "\n"]
    Close[$stream]
    

    ...再次验证:

    In[20]:= Import["file.dat", "Text"]
    
    Out[20]= *Data from data from mydata1
             0,0,50
             10,0,50
             20,0,50
             ...
             *Below data from mydata2
             21,0,0,50
             22,10,0,50
             23,20,0,50
             ...
    

    如果需要,也可以将mydata1和mydata2同时写入文件:

    $stream = OpenWrite["file.dat", BinaryFormat -> True];
    WriteString[$stream, "*Data from data from mydata1\n"]
    Export[$stream, mydata1, "CSV"]
    WriteString[$stream, "\n*Below data from mydata2\n"]
    Export[$stream, mydata2, "CSV"]
    WriteString[$stream, "\n"]
    Close[$stream]
    

    请注意,每次打开流时都会使用BinaryFormat -> True 选项。这是为了禁用流写入操作的任何自动换行插入。如果省略此选项,输出文件中会出现一些不受欢迎的双倍行距。

    【讨论】:

    • 感谢 WReach。这很有帮助!
    【解决方案2】:

    可能是这样的:

    mydata1 = 
      Flatten[Table[Table[Table[
              {xcord, ycord, zcord}, 
              {xcord, 0, 20, 10}], {ycord, 0, 20, 10}], {zcord, 50, 50, 10}], 2];
    mycounter = 20
    mydata2 = 
      Flatten[Table[Table[Table[
              {++mycounter, xcord, ycord, zcord}, 
              {xcord, 0, 20, 10}], {ycord, 0, 20, 10}], {zcord, 50, 50, 10}], 2];
    
    Export["c:\\test.txt", 
          Join[{"* data1 follows"}, mydata1, {"* data2 follows"}, mydata2], "CSV"]
    

    生成的文件是:

    * data1 follows
    0,0,50
    10,0,50
    20,0,50
    0,10,50
    10,10,50
    20,10,50
    0,20,50
    10,20,50
    20,20,50
    * data2 follows
    21,0,0,50
    22,10,0,50
    23,20,0,50
    24,0,10,50
    25,10,10,50
    26,20,10,50
    27,0,20,50
    28,10,20,50
    29,20,20,50
    

    【讨论】:

    • 感谢您的回答,我已使用您的回答,因为它符合我的要求
    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 2014-07-27
    • 1970-01-01
    • 2019-12-18
    • 2022-08-14
    • 2015-02-04
    • 1970-01-01
    相关资源
    最近更新 更多