【问题标题】:Java: Read char and bytes from TextJava:从文本中读取字符和字节
【发布时间】:2017-11-22 09:45:25
【问题描述】:

我希望有好心人可以帮助我从数据类型为文本的单行中读取字符和字节。

我有一个 Text.toString() ,其中模式是前 2 个字符,后跟 2 个字节,剩下的字符。这是一个70的定长文件。

我必须忽略这 2 个字节,这 2 个字节显示为特殊字符(有时显示为单个字符,有时显示为 2 个字符)。

我尝试使用 UTF-8、iso-8859-1、CP850、US-ASCII 等,如下所示

byte[] utf8bytes = value.toString().getBytes("iso-8859-1");
LOG.info(new String(utf8bytes, Charset.forName("UTF-8")));

输入数据:

12��00a1A10a0000000abcdef0ghijkl0abcde000000f0gh1a0bcded1234z1234  z000000000000002
12ɹ00a1A10a0000000abcdef0ghijkl0abcde000000f0gh1a0bcded1234z1234  z000000000000002

输出应该是: 1200a1A10a0000000abcdef0ghijkl0abcde000000f0gh1a0bcded1234z1234 z000000000000002 1200a1A10a0000000abcdef0ghijkl0abcde000000f0gh1a0bcded1234z1234 z000000000000002

此脚本位于 Hadoop Mapper 中。 任何帮助都会很棒,因为我一直在努力完成这项工作。

谢谢, 回复。

【问题讨论】:

  • 您可以使用substring 并删除您不需要的元素位置,如果它们始终在同一个位置。
  • @rbheemana, 2 字节是大型机二进制数据。您是否有任何参考来转换/跳过这 2 个字节。

标签: java mapreduce hadoop2


【解决方案1】:

如果您确定String 中的所有其他字符都是字母数字,您可以使用replaceAll 删除它们。请注意,我将空间留在那里,因为看起来您的预期输出想要保留它。

str = str.replaceAll("[^A-Za-z0-9 ]", "");

See it online!

【讨论】:

  • 谢谢。抱歉,我提到这 2 个字节是特殊字符。它可以是任何字符。
  • 嗯。所以你的输入可能是12T00a1A10a000001...,你想在这个例子中删除T
  • 是的,基本上将位置 1-2 读取为字符并读取接下来的 2 个字节并将剩余的字节作为字符开始。
  • @Aavik 可能很混乱,但是:将您的 String 转换为 char 数组。删除前两个字符。转换为字节数组。删除前两个字节。转换回 char 数组(从原始字符中添加前两个字符)。乱七八糟的吧?我没有时间试一试看看它是否有效,所以我现在无法更新我的答案。
  • 谢谢。让我试试这个。
【解决方案2】:

没有什么可以做到这一点。

  1. 使用您想要的逻辑编写您的自定义记录读取器。
  2. 使用字符串子字符串。
  3. 使用 byteBuffer 并提取出您不需要的索引。

【讨论】:

  • 我在 mapper 中尝试了这个逻辑。它是一个 TextInptFormat,其中每一行被读取为文本并转换为字符串,然后转换为字节。为了转换为字节,我尝试了各种字符集。按照您的建议,将子字符串转换为 byteBuffer,使用什么字符集?
  • 试过的 ByteBuffer byteBuffer = Charset.forName("UTF-8").encode(value.toString().substring(2,3));索引不起作用,因为我不知道它是 substr(2,3) 还是 substr(2,4),因为它是以字节为单位的。
  • 我将文件读取为 BufferedInputStream,读取第一个块并尝试使用 ByteBuffer 将 2-3 位置替换为空格(0x20)。这似乎不起作用。你有参考吗?
猜你喜欢
  • 1970-01-01
  • 2012-12-25
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多