在mathematica中导入和操作.txt

时间:2012-07-25 10:23:37

标签: string list import wolfram-mathematica

我有一个巨大的文本文件,我导入到mathematica。它看起来像这样:

    In[9]:=import=SplitBy[Import["textfile.txt","List"],"\\t"];

    Out[9]:={{  A   021 2.3 A   002 2.6},{  A   012 2.3 A   001 2.6},{  A   120 2.6 A   111 2.9},{  A   122 2.8 A   121 2.8},{  A   000 1.3 A   121 2.9},{  A   110 2.4 A   111 2.9},{  G   010 2.3 G   001 2.6},{  G   000 2.2 G   001 2.3 G   010 2.4},{  G   010 2.3 G   001 2.6},{  G   110 2.3 G   101 2.6}}

编辑:请注意,所有元素都以\\t字符分隔。

这是一个字符串列表,

    In[12]:= Head@import
    Head@import[[1]]
    Head@import[[All, 1]]
    Head@import[[1, 1]]

    Out[12]= List
    Out[13]= List
    Out[14]= List
    Out[15]= String

我的一个大问题是将此列表转换为可管理的元素列表,这样我就可以搜索G存在的那些,而不是A存在的位置。我尝试用a替换字符串所在的部分。但是我仍然无法按照我的意愿处理数据,因为我不允许我搜索单个G元素。理想情况下,我最终想要的是

    {{G,010,2.3},{G,001,2.6},{G,000,2.2},{G,001,2.3},{G,010,2.4},{G,010,2.3},{G,001,2.6},{G,110,2.3},{G,101,2.6}}

我已经知道我必须使用Take命令,Partition命令将子列表拆分为3个元素的子列表,依此类推。但是因为我甚至无法将数据列入列表列表中,所以我不能这样做..

此外,导入时我必须选择"List"类型。如果我导入"Table",一切都已经完成了一半,但元素“001”将变为“1”。

你能帮帮我吗?所有帮助表示赞赏! 感谢

2 个答案:

答案 0 :(得分:4)

将来,如果您可以包含要导入的实际文件的样本,将会非常有用。不过,我相信我可以准确地猜出文件的格式,以推荐这个:

data = ReadList["textfile.txt", {Word, Number, Number}]

如果文件采用我希望它应该返回的格式:

{{"A", 21, 2.3}, {"A", 2, 2.6}, {"A", 12, 2.3}, {"A", 1, 2.6}, {"A", 
  120, 2.6}, {"A", 111, 2.9}, {"A", 122, 2.8}, {"A", 121, 2.8}, {"A", 
  0, 1.3}, {"A", 121, 2.9}, {"A", 110, 2.4}, {"A", 111, 2.9}, {"G", 
  10, 2.3}, {"G", 1, 2.6}, {"G", 0, 2.2}, {"G", 1, 2.3}, {"G", 10, 
  2.4}, {"G", 10, 2.3}, {"G", 1, 2.6}, {"G", 110, 2.3}, {"G", 101, 
  2.6}}

从那里获取以"G"开头的记录可以根据您的喜好使用其中任何一个:

Cases[data, {"G", ___}]

Select[data, "G" === #[[1]] &]

Pick[data, First /@ data, "G"]

答案 1 :(得分:2)

我没有在这台机器上安装Mathematica,所以我的语法可能有点不对。

隐而不宣'吨

niceList = Partition[Flatten[import],3]

生成一个列表列表,其中内层的每个列表包含3个字符串?然后,像

Select[niceList,#[[1]]=="G"&]

应选择以"G"作为第一个元素的子列表。

修改

如果我现在了解你,你的意思是你的变量import中有一个列表列表,每个较低级别的列表,例如

{  A   021 2.3 A   002 2.6}

包含一个字符串?换句话说

FullForm[  A   021 2.3 A   002 2.6]

返回

"  A   021 2.3 A   002 2.6"

我会导入数据,用空格替换所有制表符,然后使用StringSplit[](在正确的级别)将每个字符串转换为字符串列表。然后是FlattenPartition等。您可能会发现最简单的方法是首先将文件的全部内容导入到单个字符串中