我有一个字符串,我从一个文本文件。
文本文件:
Line 1
Line 2
Line 3
...
我想把它转换成一个数组,每行一个数组元素。
[ "Line 1", "Line 2", "Line 3", ... ]
根据文件的保存方式,字符串可以采用以下形式之一:
string = "Line 1\nLine 2\nLine 3\n..."
其中\n
是新行(换行符)字符string = "Line 1\r\nLine 2\r\nLine 3\r\n..."
,其中\r
是回车符。
据我所知,\n
是目前苹果/Linux中常用的,而\r\n
是Windows中常用的。
如何在任意一个换行符处拆分字符串,以得到一个没有空元素的String数组?
更新
下面有几个解决方案。在这一点上,我没有任何令人信服的理由选择一个比其他更正确。一些可能影响选择的因素可能是(1)它有多"迅速",(2)它对很长的字符串有多快。你可以通过投票一个或多个和/或留下评论来提供反馈。
9条答案
按热度按时间okxuctiv1#
可以使用新的
Character
属性isNewline
拆分String
:您还可以扩展StringProtocol并创建lines示例属性,以将字符串行分解为子序列:
x一个一个一个一个x一个一个二个x
您可以使用字符串方法enumerateLines:
枚举字符串中的所有行。
一个一个三个一个一个一个一个一个四个一个一个一个一个一个五个一个
vh0rcniy2#
在Xcode 8.2和Swift 3.0.1中:
使用NSString方法组件(以:分隔)
或者使用String方法enumerateLines,如
Leo Dabus
的答案nr7wwzry3#
在Swift 2中,顶层
split
函数现在是CollectionType
上的一个方法(String
的每个"字符视图"都符合这个方法)。这个方法有两个版本,您需要一个将闭包作为 predicate 的方法,以指示给定的元素是否应该被视为分隔符。可以使用
string.utf16
从字符串中获取字符集合,作为UTF16字符的集合,使其与NSCharacterSet
API兼容。这样,我们可以很容易地在闭包内部检查字符串中的给定字符是否是换行符集的成员。值得注意的是,
split(_:)
将返回SubSequence
字符(基本上是一个Slice
),所以它需要转换回一个字符串数组,这通常更有用。我已经在下面使用flatMap(String.init)
完成了这一操作-String
上的UTF16View
初始化程序是失败的,因此使用flatMap
将忽略任何可能返回的nil
值,确保您返回的是非可选字符串数组。因此,有一种类似Swift的好方法:
split
方法有一个参数allowEmptySubsequences
,它确保在结果中不会收到任何空字符序列,默认值是false
,所以实际上根本不需要指定它。编辑
如果您想完全避免使用
NSCharacterSet
,您可以很容易地拆分符合unicode的Character
集合。Swift可以将
"\r\n"
视为一个扩展的字素簇,将其作为一个Character
用于比较,而不是创建一个String
。还要注意的是,从Character
创建字符串的初始化器是不可失败的,所以我们可以只使用map
。p1tboqfb4#
这个答案是对已经给出的其他解决方案的总结,它来自我的fuller answer,但是在这里提供实际的方法选择会很有用。
新行通常使用
\n
字符,但也可以使用\r\n
(从保存在Windows中的文件)。溶液
如果不使用
filter
,则\r\n
将生成一个空数组元素,因为它被计为两个字符,因此在同一位置将字符串分隔两次。或
这里
\r\n
被计为单个Swift字符(扩展的字素簇)有关
enumerateLine
语法的更多信息,请参见this answer。备注:
\r\n
和\n
,但我在这里这样做是为了说明这些方法可以处理这两种格式。NSCharacterSet.newlineCharacterSet()
是定义为(U +000A-U +000D,U +0085)的换行符,包括\r
和\n
。4smxwvx55#
o2rvlv0m6#
为了记录在案,Swift的基础
CharacterSet
可用于拆分:备选方案1
备选方案2
pb3skfrl7#
如何在任意一个换行符处拆分字符串,以得到一个没有空元素的String数组?
你就快到了--只是尾部闭包不同而已:
这与以下内容相同:
ETA:删除尾部闭合处不必要的额外支架
iszxjhcz8#
雨燕4:
我建议您先将CSV保存为字符串,如果您还没有这样做的话,然后通过删除不必要的回车来“清理”字符串
上面将给予一个具有最理想格式的字符串,然后您可以使用\n作为分隔符来分隔字符串:
现在您有一个包含3个项目的数组,如下所示:
[“第一行”、“第二行”、“第三行”]
我正在使用CSV文件,完成此操作后,我将项目拆分为组件,因此,如果您的项目类似于:
[“第1行、第2行、第3行”、“第A行、第B行、第C行”]
mnemlml89#