【问题标题】:Importing and manipulating a .txt in mathematica在 Mathematica 中导入和操作 .txt
【发布时间】:2012-07-25 10:23:36
【问题描述】:

我有一个巨大的文本文件,要导入到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 的元素。我尝试用 .但是我仍然无法按照我的意愿处理数据,因为我不允许我搜索单个 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”。

你们能帮帮我吗?感谢所有帮助! 谢谢

【问题讨论】:

  • 如何拥抱?虽然您很难将其放入记忆中?
  • 它有好几千行。问题是除了里面有很多文本之外,我还必须处理数百个这样的文件

标签: string list import wolfram-mathematica


【解决方案1】:

将来,如果您可以包含您正在导入的实际文件的示例,将会非常有帮助。尽管如此,我相信我可以足够准确地猜出文件的格式来推荐这个:

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"]

【讨论】:

  • 谢谢向导先生。下次我会这样做 - 我现在没有文件。如果我想忽略“G”等开头之前的几行怎么办?例如,我有几行随机句子写在我感兴趣的列表开始之前。
  • @SosiKun 在这种情况下,您将使用stream = OpenRead["file.txt"],然后使用Skip[stream, . . .](阅读Skip 的文档),最后使用ReadList[stream, {Word, Number, Number}]。 (完成后您应该关闭流:Close[stream]
【解决方案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 等。您可能会发现首先将文件的全部内容导入单个字符串是最简单的方法

【讨论】:

  • 确实,niceList 就是这样工作的。但主要问题是我仍然在字符串中得到\\t 字符。选择niceList 中的一个元素会得到{ G 201 3.2 G 009 3.2}... 我知道我可以用, 替换字符串中的每个\\t,但这仍然没有给我一个可处理的元素列表,我可以使用SelectTake
  • 是的,我成功了!现在我得到了我想要的完整列表!谢谢!您首先将所有内容都视为字符串的提示非常重要!
猜你喜欢
  • 2011-09-07
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多