我在一個.txt檔案中有一個名稱串列,格式如下:
“蒂姆”、“戴夫”、“西蒙”
輸入將始終是引號中的單值名稱,逗號分隔并在一行中。
我想將這些讀入String[] names.
我有以下代碼,但輸出將它們中的每一個都放在雙引號中,這意味著它看起來像:
“蒂姆”、“戴夫”、“西蒙”
我也無法使用任何第三方庫。
我如何得到它,以便 String 陣列中的每個元素只有一組雙引號?
String[] names = {};
// arraylist to store strings
List<String> listOfStrings = new ArrayList<String>();
// load content of file based on specific delimiter
Scanner sc = new Scanner(new FileReader("names.txt")).useDelimiter(",");
String str;
while (sc.hasNext()) {
str = sc.next();
listOfStrings.add(str);
}
uj5u.com熱心網友回復:
我在 .txt 檔案中有一個名稱串列,這些名稱已經是字串格式:
他們實際上不是;那不是“字串格式”;實際上沒有“字串格式”之類的東西。
鑒于輸入檔案包含引號,并且您知道這些引號實際上并不是輸入的一部分,而只是分隔輸入,我們可以減少對實際格式的合理猜測。實際上只有兩種常用的格式:
標準 CSV 格式
“CSV”(“字符分隔值”)是一種極為常見的資料交換格式。不幸的是,沒有規范。但到目前為止,這種格式最常見的“采取”涉及以下轉義規則:
- 換行符分隔記錄。
- 某些指定字符將單個記錄中的 2 個專案分開;通常是逗號、制表符或分號 - 在您的輸入中顯然是逗號。
- 那么..如果其中一項包含逗號或換行符,該怎么辦?通常的答案是在這種情況下將輸入括在引號中,有時,即使不需要,CSV 輸出工具也會對所有內容進行引號分隔(例如,大概是您的示例)。然而,這又引發了另一個問題:如果輸入包含引號怎么辦。然后,答案是把它們加倍。因此,文字字串:
Jane said: "Well, hello there!"變為, inexample.csv:
"Jane said: ""Well, hello there!"""
甚至還有一個標準:RFC 4180。這是一個單頁紙。隨意快速瀏覽一下。
反斜杠轉義 CSV
考慮到大約 90% 的編程語言都有這樣作業的字串常量,另一種變得越來越流行的方法是將反斜杠符號視為轉義符號:反斜杠后面總是跟一個字符,這對一起告訴你基于查找表的實際意圖。常見的逃逸有:
\n-> 這是一個換行符\t-> 一個選項卡\"-> 字面參考\,-> 文字逗號
還有一些(\r, \f, \b, \123,\u1234都比較常見)。
除非此文本檔案的來源告訴您它是哪種格式,或者通過獲取包含此類字串的更復雜的輸入,否則根本無法知道。如果您可以控制輸出的實際文字文本,請在文字文本中使用換行符和逗號以及雙引號制作一個復雜的字串,將其匯出到此文本檔案中,看看它的樣子。
那么我該如何決議呢?
它非常復雜 - 正確決議它的代碼有很多頁。不過,你很幸運!存在大量的庫。
通常的方法是使用OpenCSV - 這是一個指導您了解如何使用它的教程。
我只想要一個字面上的字串Tim, Dave, Simon
好吧,這不是您的輸入檔案所說的;很明顯,您的輸入檔案是某種未知格式,您將不得不解釋如何從文本檔案包含的概念中獲得的火焰中得到單個字串變數的"Tim", "Dave", "Simon"期望。Tim, Dave, Simon也許輸入確實是 CSV 格式,您只需要將每個專案連接在一起,用逗號分隔。在這種情況下,使用 OpenCSV 讀取它,然后撰寫連接專案所需的非常簡單的代碼。OpenCSV 可以為您提供一個List<String>表示輸入的“行” - 將其轉換為單個逗號分隔的字串,這很容易:
String[] csvLine = opencsv.readNext();
String output = String.join(", ", csvLine);
assert output.equals("Tim, Dave, Simon");
uj5u.com熱心網友回復:
對不起。其實這個更好
add(s.replace("\"", ""));
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/477276.html
標籤:爪哇 数组 细绳 java.util.scanner 文件阅读器
