2017-08-13 19 views
2

- 私の後に数字だけを返します。文字列は次のような文字列を分離しようとしているseparatedBy

let path = "/Users/user/Downloads/history.csv" 

    do { 
     let contents = try NSString(contentsOfFile: path, encoding: String.Encoding.utf8.rawValue) 
     let rows = contents.components(separatedBy: "\n") 

     print("contents: \(contents)") 
     print("rows: \(rows)") 

    } 
    catch { 
    } 

私はほとんど同じで見ている2つのファイルを、持っています。 最初のファイルからの出力は、このようなものです:print(content)があるので、だから、両方のファイルが文字列として読める

contents: 40.75013313,0.00064825,5/18/2017 7:17:01 PM 

19.04004820,0.00059900,5/19/2017 9:17:03 PM 

rows: ["4\00\0.\07\05\00\01\03\03\01\03\0,\00\0.\00\00\00\06\04\08\02\05\0,\05\0/\01\08\0/\02\00\01\07\0 \07\0:\01\07\0:\00\01\0 \0P\0M\0", "\0", "1\09\0.\00\04\00\00\04\08\02\00\0,\00\0.\00\00\00\05\09\09\00\00\0,\0\05\0/\01\09\0/\02\00\01\07\0 \09\0:\01\07\0:\00\03\0 \0P\0M\0", "\0", "\0", "\0"] 

出力はFile1:

contents: 2017-07-31 16:29:53,0.10109999,9.74414271,0.98513273,0.15%,42302999779,-0.98513273,9.72952650 
2017-07-31 16:29:53,0.10109999,0.25585729,0.02586716,0.25%,42302999779,-0.02586716,0.25521765 


rows: ["2017-07-31 16:29:53,0.10109999,9.74414271,0.98513273,0.15%,42302999779,-0.98513273,9.72952650", "2017-07-31 16:29:53,0.10109999,0.25585729,0.02586716,0.25%,42302999779,-0.02586716,0.25521765", "", ""] 

出力ファイル2ワーキング。 しかし、文字列が分離されるとすぐに、2番目のファイルはもう読み込めません。 私はさまざまなエンコーディングを試みましたが、何も機能しませんでした。誰もが考え、文字列を2番目のファイルに強制的に読み込み可能な文字列にする方法はありますか?

+1

エンコードに関連している必要があります。生のcsvファイルをどこかにアップロードできますか? – nathan

+2

これは以前に削除された質問https://stackoverflow.com/questions/45662712/problems-with-csv-file-typeに関連していますか? - 私が示唆したように 'CSVReader(ストリーム:ストリーム、コーデックタイプ:UTF16.self、エンディアン:.big/.little)を試しましたか? –

+1

エンコーディングを自動的に検出するにはhttps://stackoverflow.com/questions/18851558/ios-whats-the-best-way-to-detect-a-files-encodingを参照してください。 –

答えて

2

あなたのファイルは明らかにUTF-16(リトルエンディアン)エンコードです:ASCII文字の場合

 
$ hexdump fullorders4.csv 
0000000 4f 00 72 00 64 00 65 00 72 00 55 00 75 00 69 00 
0000010 64 00 2c 00 45 00 78 00 63 00 68 00 61 00 6e 00 
0000020 67 00 65 00 2c 00 54 00 79 00 70 00 65 00 2c 00 
0000030 51 00 75 00 61 00 6e 00 74 00 69 00 74 00 79 00 
... 

、UTF-16エンコーディングの最初のバイトは ASCIIコードで、2番目のバイトがゼロであります。

ファイルがUTF-8として読み取られる場合、0は ASCII NUL文字に変換されます。これは出力に\0と表示されます。

let contents = try NSString(contentsOfFile: path, encoding: String.Encoding.utf16LittleEndian.rawValue) 
// or: 
let contents = try String(contentsOfFile: path, encoding: .utf16LittleEndian) 

に使用されるエンコーディング を(iOS: What's the best way to detect a file's encodingと比較)を検出しようとする方法もある:utf16LittleEndianはあなたのケースで を動作したがってエンコーディングを指定

。スウィフトでは、それはそれ有効なUTF-8であるため、しかし、あなたの特定のケースでは、それが再びUTF-8 としてファイルを読んでいました

var enc: UInt = 0 
let contents = try NSString(contentsOfFile: path, usedEncoding: &enc) 
// or: 
var enc = String.Encoding.ascii 
let contents = try String(contentsOfFile: path, usedEncoding: &enc) 

だろう。 byte order mark (BOM) をファイル(UTF-16リトルエンディアンの場合はFF FE)に先行させると、それは確実に 問題を解決します。

関連する問題