当前位置:  开发笔记 > 数据库 > 正文

在普通文本<ASCII 128中使用最少的分隔符

如何解决《在普通文本<ASCII128中使用最少的分隔符》经验,为你挑选了8个好方法。

由于编码原因会让你感到恐惧(我不好意思),我需要在一个字符串中存储一些文本项.

我将使用一个角色来划分它们.

哪个角色最适合用于此,即哪个角色最不可能出现在文本中?必须是可打印的,并且在ASCII中可能小于128,以避免区域设置问题.



1> Nick Fortesc..:

假设出于一些令人尴尬的原因,你不能使用CSV我会说与数据一起使用.获取一些样本数据,并为每个值0-127执行简单的字符计数.选择其中一个不会发生的.如果选择太多,请获取更大的数据集.写作不会花费太多时间,您将获得最适合您的答案.

对于不同的问题域,答案会有所不同,所以| (管道)在shell脚本中很常见,^在数学公式中很常见,对于大多数其他字符也是如此.

我个人认为我会去| (管道)如果给出了选择但是使用真实数据是最安全的.

无论你做什么,请确保你已经制定了一个逃避计划!



2> Edwin Buck..:

我会选择"单位分隔符"ascii代码"US",ascii 30(0x1F)

在过去,过去,大多数事情是连续完成的,没有随机访问.这意味着将一些控制代码嵌入到ASCII中.

ASCII 28 (0x1C) File Separator - Used to indicate separation between files on a data input stream.
ASCII 29 (0x1D) Group Separator - Used to indicate separation between tables on a data input stream (called groups back then).
ASCII 30 (0x1E) Record Separator - Used to indicate separation between records within a table (within a group).  These roughly map to a tuple in modern nomenclature.
ASCII 31 (0x1F) Unit Separator - Used to indicate separation between units within a record.  The roughly map to fields in modern nomenclature.

单位分隔符是ASCII格式,并且有Unicode支持显示它(通常是同一个字形中的"us")但许多字体不显示它.

如果你必须显示它,我会建议在解析成字段后在应用程序中显示它.



3> SQLMenace..:

可能| 或者^或〜你也可以组合两个字符


使用两次相同将防止任何误解.喜欢|| 要么 ##

4> 小智..:

使用不同语言时,此符号:¬

被证明是最好的.但是我还在测试.


这不是ASCII.

5> Alex Fort..:

你如何使用CSV样式格式?可以使用标准CSV格式转义字符,并且已经编写了很多解析器.



6> Jason S..:

你说"可打印",但可以包括选项卡(0x09)或换页符(0x0c)等字符.我几乎总是选择制表符而不是逗号用于分隔文件,因为逗号有时会出现在文本中.

(有趣的是该ASCII表具有字符GS(0x1D),RS(0X1E),和美国(0x1F的),用于组,记录和单元分隔符,任何那些是/是).

如果"可打印"是指用户可以识别并轻松输入的字符,我会选择管道 符号首先,与其他一些奇怪的字符(@或者~^或者\,或者我在这里似乎无法进入的反引号)作为一种可能性.这些字符+=!$%&*()-'":;<>,.?/似乎更容易出现在用户输入中.至于下划线_和哈希#以及{}[]我不知道的括号.


标准的ASCII代码表包括四个专门为此目的设计的控制代码,如上面的Jason S所述.它们是:`28 FS`文件分隔符,`29 GS`组分隔符,`30 RS`记录分隔符,`31 US`单位分隔符.不幸的是,几乎没有人使用它们,尽管这正是它们的目的.就个人而言,我讨厌CSV格式的文件,因为如果我们想要支持他们的文件格式,那么很多人都不会想到事情并弄乱我们程序员必须处理的问题.
@deegee这可能是这里最好的答案.除非数据包含二进制或非标准的ascii/unicode,否则它将始终以任何语言运行.你应该把它变成一个常规答案.

7> Jay..:

你能用管道符号吗?这通常是逗号或制表符分隔字符串后的下一个最常见的分隔符.大多数文本不太可能包含管道,ord('|')为我返回124,所以这似乎符合您的要求.



8> 小智..:

为了快速转义,我使用这样的东西:说你要结合str1,str2和str3,我做的是:

delimitedStr=str1.Replace("@","@a").Replace("|","@p")+"|"+str2.Replace("@","@a").Replace("|","@p")+"|"+str3.Replace("@","@a").Replace("|","@p");

然后检索原始用途:

splitStr=delimitedStr.Split("|".ToCharArray());
str1=splitStr[0].Replace("@p","|").Replace("@a","@");
str2=splitStr[1].Replace("@p","|").Replace("@a","@");
str3=splitStr[2].Replace("@p","|").Replace("@a","@");

注意:替换的顺序很重要

它坚不可摧,易于实施


这真的是最好的答案,也是唯一正确的imo.这是唯一无法解决的答案.所有其他答案只会降低输入打破格式的概率,但这是一种非常糟糕的方法.所选择的答案正确地说明了使用这样的逃避方案 - 但是一旦你做出选择分隔符基本上是无关紧要的.
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有