5赞
510
当前位置:  开发笔记 > 编程语言 > 正文

Ruby:文本文件中的哈希数组-Ruby:arrayofhashesfromtextfile

LetssayIhavetextfilelikethis:假设我有这样的文本文件:123456789Iwanttoreaditintoda

Lets say I have text file like this:

假设我有这样的文本文件:

1 2 3
4 5 6
7 8 9
...

I want to read it into data structure like this:

我想把它解读成这样的数据结构:

h[1] = { "a" => 1, "b" => 2, "c" => 3 }
h[2] = { "a" => 4, "b" => 5, "c" => 6 }
h[3] = { "a" => 7, "b" => 8, "c" => 9 }

At first it seems easy. I use:

起初看起来很容易。我使用:

 lines=File.read(ARGV[0]).split("\n")
 h=[]
 lines.each ( |x| h <

And completely stuck at this point. How can I convert h to array of hashes?

完全停留在这一点上。如何将h转换为哈希数组?

5 个解决方案

#1


4  

lines = File.readlines(ARGV[0])
lines.map { |l| x = l.split(/\s/).map(&:to_i); { 'a' => x[0], 'b' => x[1], 'c' => x[2] } }

#2


4  

def parse(filename)
  File.readlines(filename).map do |line|
    Hash[('a'..'c').zip(line.split.map(&:to_i))]
  end
end

parse(ARGV[0]) # => [{"a"=>1, "b"=>2, "c"=>3}, {"a"=>4, "b"=>5, "c"=>6}, {"a"=>7, "b"=>8, "c"=>9}] 

#3


1  

There is a Gem you can use for this: smarter_csv

您可以使用Gem: smarter_csv

Put this in your Gemfile:

把这个放在你的Gemfile里:

 gem 'smarter_csv',  '1.0.5'

and then:

然后:

 require 'smarter_csv'
 result = SmarterCSV.process('/tmp/bla.csv', 
         {:col_sep => ' ', 
          :headers_in_file => false, 
          :user_provided_headers => ['a','b','c'],
          :strings_as_keys => true
         }
 )
  => [{"a"=>1, "b"=>2, "c"=>3}, 
      {"a"=>4, "b"=>5, "c"=>6}, 
      {"a"=>7, "b"=>8, "c"=>9}] 

 result[0]
  => {"a"=>1, "b"=>2, "c"=>3}

See also: smarter_csv README

参见:smarter_csv README

#4


1  

I'd use:

我使用:

require 'pp'

ary = []
DATA.each_line do |li|
  ary <

Running that I get:

我得到的运行:

[{"a"=>"1", "b"=>"2", "c"=>"3"},
 {"a"=>"4", "b"=>"5", "c"=>"6"},
 {"a"=>"7", "b"=>"8", "c"=>"9"}]

Change ary to h if you want that to be your variable name.

如果你想让它成为你的变量名,就把ary改成h。

If you're reading from a file use File.foreach('file/to/read.txt') instead of each_line.

如果您正在读取一个文件,请使用file .foreach('file/to/read.txt')代替each_line。

#5


0  

My solution is not as elegant as Christian's:

我的解决方案不像克里斯汀的那么优雅:

base = ['a','b','c']
h=[]
i = 0 # traverses the a,b,c
j = 1 # traverses the lines of the hash h

File.open(ARGV[0]).each_line do |line|
  arr = line.split(' ')
  arr.each do |x|
    if !h[j].nil?
      h[j][base[i]] = x.to_i
    else # first entry in the hash should be set like this:
      h[j] = {base[i] => x.to_i}
    end
    i += 1;
  end
  i = 0
  j += 1
end
p h[1]
p h[2]
p h[3]

output:

输出:

{"a"=>"1", "b"=>"2", "c"=>"3"}
{"a"=>"4", "b"=>"5", "c"=>"6"}
{"a"=>"7", "b"=>"8", "c"=>"9"}

I started from j = 1 since that's what the OP asked for, even though it would probably make more sense to start from zero.

我从j = 1开始因为这是OP要求的,即使从0开始更有意义。


推荐阅读
  • 有个调查,要搞清楚为什么IE8访问特别慢,IE11和别的Browser都没问题。环境是Apache+WebLogic做的一个Login网页,瞬间就完了的事儿,IE8却耗费30秒才出 ... [详细]
  • 如何解决《构建:找不到'node'的类型定义文件》经验,为你挑选了2个好方法。 ... [详细]
  • 如何解决《为Angular根组件/模块指定@Input()参数》经验,为你挑选了2个好方法。 ... [详细]
  • 使用的Tomcat版本是apache-tomcat-6.0.20详细的环境变量配置参考windows7系统安装与配置Tomcat服务器环境网址为http:jingyan.baidu ... [详细]
  • 本人一直开发安卓,头一次搭服务器~于是第一次倒腾centos。于是就买了个最新的centos7.2的云主机,然后再加个Tomcat8搭建一个最最最基本的javaweb运行环境。 ... [详细]
  • ASP.NETCORE系列【一】搭建ASP.NETCORE项目
    原文:ASP.NETCORE系列【一】搭建ASP.NETCORE项目为什么要使用ASP.NETCore?NETCore刚发布的时候根据介绍就有点心里痒痒,微软的尿性都懂的,新东西b ... [详细]
  • 精通软件性能测试与LoadRunner实战性能技巧查询软件性能测试过程详解与案例剖析读性能测试理论性能测试进阶指南loadrunner9.1实战这是一本比loadrunner中文文 ... [详细]
  • mapreduce 的基本原理
    MapReduce角色?Client:作业提交发起者。?JobTracker:初始化作业,分配作业,与TaskTracker通信,协调整个作业。?TaskTracker:保持Job ... [详细]
  • 中文文档API: http:requests.kennethreitz.orgzh_CNlatest安装获取网页保存图片获取状态码以及判断请求是否成功带header头伪装浏览器爬取 ... [详细]
  • 如今面向对象的思想已经设计到软件开发的各个方面。如,面向对象的分析(OOA,ObjectOrientedAnalysis),面向对象的设计(OOD,ObjectOrientedDe ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • centos 安装cronolog及对catalina.out按天分割
    安装cronolog 1.下载安装包 wgethttps:files.cnblogs.comfilescrazyzerocronolog-1.6.2.tar.gz 2.安装cron ... [详细]
  • 前端学习内容总结
    基础:1、语义化H5标签1.1、H5引进了一些新的标签,特别注意article、header、footer、aside、nav等,注意HTML的标题结构1.2、理解浏览器解析 ... [详细]
  • 输入不超过1000的正整数你,输出其阶乘的准确的值。求阶乘大家都会,用递归就可以搞定,开销会比较大。阶乘增长是很快的,c语言中int值的范围大小与电脑位数n有关。整数区间为[-2^ ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
author-avatar
U友50141148
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有