- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个文件,其中包含由空行分隔的文本 block ,如下所示:
block 1
some text
some text
block 2
some text
some text
如何将其读入数组?
最佳答案
这个问题经常被问到,我认为解释一下该怎么做会很有用,但首先我需要说一下:
不要尝试一口气读取文件。这称为“吞吐”,这是一个糟糕的主意,除非您可以保证您始终会读取小于 1MB 的文件尺寸。有关详细信息,请参阅“Why is "slurping" a file not a good practice?”。
如果我有一个如下所示的文件:
block 1
some text
some text
block 2
some text
some text
我试着正常阅读它,我会得到类似的东西:
File.read('foo.txt')
#=> "block 1\nsome text\nsome text\n\nblock 2\nsome text\nsome text\n"
这会让我不得不将它拆分成单独的行,试图找到空白行,然后将其分成 block 。而且,总是,天真的解决方案是使用正则表达式,这 kind-a 有效但不是最佳的。
或者我们可以尝试:
File.readlines('foo.txt')
#=> ["block 1\n", "some text\n", "some text\n", "\n", "block 2\n", "some text\n", "some text\n"]
然后还是要找空行,把数组转成子数组。
相反,有两种简单的方法来加载文件。
请记住之前关于 slurping 文件的警告,如果它是一个我们可以使用的小文件:
File.readlines('foo.txt', "\n\n")
#=> ["block 1\nsome text\nsome text\n\n", "block 2\nsome text\nsome text\n"]
注意 "\n\n"
的使用在第二个参数中。这就是“行分隔符”,对于 *nix 操作系统通常定义为“\n”,对于 Windows 定义为“\r\n”。它实际上基于操作系统派生的全局值 Ruby 集,亲切地称为 $/
。 , $RS
或 $INPUT_RECORD_SEPARATOR
.它们记录在 English 中模块。记录分隔符是文本文件中用于分隔两行的字符,或者,对于我们的目的,由两个行尾字符分隔的一组行,或者换句话说,一个段落。
阅读后,很容易清理内容以删除结尾的行尾:
File.readlines('foo.txt', "\n\n").map(&:rstrip)
#=> ["block 1\nsome text\nsome text", "block 2\nsome text\nsome text"]
或者将它们分解成子数组:
File.readlines('foo.txt', "\n\n").map{ |s| s.rstrip.split("\n") }
#=> [["block 1", "some text", "some text"], ["block 2", "some text", "some text"]]
所有示例都可以与类似于以下的段落一起使用:
File.readlines('foo.txt', "\n\n").map(&:rstrip).each do |line|
# do something with line
end
或:
File.readlines('foo.txt', "\n\n").map{ |s| s.rstrip.split("\n") }.each do |paragraph|
# do something with the sub-array `paragraph`
end
如果它是一个大文件,我们可以通过foreach
使用Ruby 的逐行IO。如果文件尚未打开,或 each_line
如果它是一个已经打开的文件。而且,由于您阅读了上面的链接,您已经知道我们为什么要使用逐行 IO。
File.foreach('foo.txt', "\n\n") #=> #<Enumerator: File:foreach("foo.txt", "\n\n")>
foreach
返回一个枚举器,所以我们需要处理 to_a
读取数组以便我们可以看到结果,但通常我们不必这样做:
File.foreach('foo.txt', "\n\n").to_a
#=> ["block 1\nsome text\nsome text\n\n", "block 2\nsome text\nsome text\n"]
使用方便foreach
像上面一样:
File.foreach('foo.txt', "\n\n").map(&:rstrip)
#=> ["block 1\nsome text\nsome text", "block 2\nsome text\nsome text"]
File.foreach('foo.txt', "\n\n").map(&:rstrip).map{ |s| s.rstrip.split("\n") }
#=> [["block 1", "some text", "some text"], ["block 2", "some text", "some text"]]
注意:我强烈怀疑使用 map
那样会导致与吞噬文件类似的问题,因为 Ruby 会缓冲 foreach
的输出。在将其传递给 map
之前.相反,我们需要对 do
中读取的每个段落进行操作。 block :
File.foreach('foo.txt', "\n\n") do |ary|
ary.rstrip.split("\n").each do |line|
# do something with the individual line
end
end
这样做对性能的影响很小,但因为目标是按段落或 block 处理,所以这是可以接受的。
另请注意,这是一个社区 Wiki,因此请适本地进行编辑和贡献。
关于arrays - 如何按段落或 block 将文件读入数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32955842/
我的 blockly.js 文件中有以下代码 Blockly.Blocks['account_number'] = { // Other type. init: function() {
首先抱歉我的英语不好,我正在开发 Image Splitter 应用程序并且已经完成,但是现在的要求是当图像被分割(分成几 block /chunks)那么图像 block 的每一 block (ch
#value: 消息的返回值,当发送到一个 block 时,是该 block 中最后一句话的值。所以 [ 1 + 2. 3 + 4. ] value 计算结果为 7。我发现有时很难使用。有没有办法显式
我想构建一个包含 3 div 的响应式导航栏相同的 width和 height . 我申请了 inline-block到每个 block ,我得到一个我不理解的行为。 问题是,第三 block 由 2
我希望使用 Blockly 来允许非技术人员用户指定测试脚本。 它的一部分需要一个文件选择器,但是,我看不到 Blockly 有一个。是吗? 实际上,我找不到完整的标准 block 列表。谁有网址?
仅当您位于父 block 内部时,父 block 的 props.isSelected 才为 true,但当您在该 block 的 innerBlocks 内进行编辑时则不然。 如何从父 block
仅当您位于父 block 内部时,父 block 的 props.isSelected 才为 true,但当您在该 block 的 innerBlocks 内进行编辑时则不然。 如何从父 block
我想创建一个具有不同背景颜色 block 和不同悬停颜色 block 的导航栏 block 。我可以分别创建不同的悬停颜色 block 或不同的背景颜色 block ,但不能一起创建。所以请告诉我如何
我正在使用看到的代码 here定期执行代码: #define DELAY_IN_MS 1000 __block dispatch_time_t next = dispatch_time(DISPATC
为什么 block 必须被复制而不是保留?两者在引擎盖下有什么区别?在什么情况下不需要复制 block (如果有)? 最佳答案 通常,当您分配一个类的实例时,它会进入堆并一直存在,直到它被释放。但是,
我想弄清楚我这样做是否正确: 如果我有一个 block ,我会这样做: __weak MyClass *weakSelf = self; [self performBlock:^{
我想制作一个 4 block 导航菜单,虽然我已经显示了一个 block ,然后单击打开第二个 block ,从第二个开始选择并再次单击出现第三个 block ,第四个 block 相同...这是我的
例如,这样更好吗? try { synchronized (bean) { // Write something } } catch (Int
我想让一只乌龟检查前方小块的颜色并决定移动到哪里。如果前面的补丁不是白色的,那么乌龟向左或向右旋转并移动。我的 If 决策结构中出现错误,显示“此处应为 TRUE?FALSE,而不是 block 列表
我想创建一个 block 对角矩阵,其中对角 block 重复一定次数,非对角 block 都是零矩阵。例如,假设我们从一个矩阵开始: > diag.matrix [,1] [,2] [
我是区 block 链新手。突然我有一个问题,我们是否可以通过区 block 号来访问以太坊区 block 链上之前的区 block 数据。 例如我创建了一个block1、block2。 block
我是区 block 链新手。突然我有一个问题,我们是否可以通过区 block 号来访问以太坊区 block 链上之前的区 block 数据。 例如我创建了一个block1、block2。 block
我创建了一个等距环境,全部使用 Javascript 和 HTML5 (2D Canvas),大部分情况下工作正常。我面临的问题是使用不同高度的图 block ,然后对图 block 上的对象索引进行
这是令我困惑的代码: public Integer getInteger(BlockingQueue queue) { boolean interrupted = false; try
我有一个基于 TPL 数据流的应用程序,它仅使用批处理 block 和操作 block 就可以正常工作。 我已经添加了一个 TransformBlock 以尝试在发布到批处理 block 之前从源中转
我是一名优秀的程序员,十分优秀!