2009-11-18 76 views
0

我有空間分隔值的字符串,我想從某個索引選取另一個索引並將其保存在一個變量中。這些字符串如下:如何檢查一個字符串中的某個位置是否爲空c#

John Doe  Villa Grazia   323334I 

我設法用的ID卡(第3列)存儲:

if (line.length > 39) 
{ 
    idCard = line.Substring(39, 46); 
} 

但是,如果我儲存的姓名和地址(第1和第2列)子字符串會有空的空格,因爲它們長度不一樣(不像身份證)。我如何存儲這兩個值並刪除非空格空間,但允許姓名和姓氏之間的空格?

+0

有沒有一種可以用人理解的方式來打破名字和地址? – shahkalpesh

+0

第二個想法是,你可以用空格字符來分隔整行,假定第一和第二個元素是姓和名,第三和第四個是姓名和地址地址字符串,第5個會是ID。只是猜測,只要是假設。 – shahkalpesh

+1

你不能讓空格字符在同一時間做兩件事;您可以將它作爲「(神奇)令牌分隔符」或作爲字符串中的字符。也許你應該考慮用逗號(,)分隔列? – scraimer

回答

4

試試這個:

string line = " John Doe  Villa Grazia   323334I"; 
string name = line.Substring(02, 16).Trim(); 
string address = line.Substring(18, 23).Trim(); 
string id  = line.Substring(41, 07).Trim(); 
+0

假設每個字段的寬度是預先定義的(索引號),這是一個很好的解決方案。雖然在生產中將數字提取到常量並在創建字符串時使用它們也很好,但是在更改它們時不要引入錯誤。 – TheSean

+1

當您將它們保存回來時,您可以使用PadRight來確保它們都返回正確的填充量,我認爲這是您之後的內容。 http://msdn.microsoft.com/en-us/library/system.string.padright(VS.71).aspx –

+0

在生產中理想情況下,你會使用某種形式的定義表而不僅僅是常量 - 確定這仍然conantsants ( - :只是抽象了一下 – Murph

3
var values = line.Split(' '); 
string name = values[0] + " " + values[1]; 
string idCard = values[4]; 

如果在前面的列中沒有可靠的空格,就不可能在沒有數據庫名稱的情況下進行查找。

+0

這是一個很好的通用解決方案,但是如果你的姓氏在其中有一個空間「Mc Grath」,例如它將無法工作。 – TheSean

+0

你可以過濾空間上的輸入,但這似乎是一個糟糕的解決方案,一般來說,csv至少會好一點。 –

1

你甚至可以得到這樣的ID,當它前面的所有東西都是可變長度的時候?如果用於我的名字, 「大衛Hedlund的323334I」,該ID將在POS 14開始,而不是39

嘗試這種更動態的方法:

var name = str.Substring(0, str.LastIndexOf(" ")); 
var id = str.Substring(str.LastIndexOf(" ")+1); 
+0

不是,因爲在文本文件中,所有東西都放置在彼此之下並處於確切的位置。我只是試了一下,它的工作。所有的Ids被檢索到 – seedg

+0

好吧,當我回答問題時,輸入字符串被格式化,看起來好像每個單詞之間只有一個空格,但是,如果它們全都位於固定長度的位置上,然後用trim()方法解決問題的方案 –

1

看起來你的解析策略會給你帶來很多麻煩。你不應該依靠字符串的大小來解析它。

爲什麼不以CSV格式保存數據(John Doe,Villa Grazia,323334I)? 那樣,你可以假設每個「列」將被一個逗號分開,這將使你的分析工作更容易。

+0

我刪除了.length部分,我現在只使用子字符串,它不應該像這樣引起麻煩嗎? – seedg

+0

@Chris:關於使用字符串內部位置的相同建議,它會讓你的解析代碼非常脆弱,你應該儘量避免這樣做 如果你不能改變這些文件的格式,並且你確定每一個「列」都將在一個永遠不會改變的固定長度內正如你所看到的)比我想這是你唯一的選擇 –

1

可能的「DOH!」問題,但你確定它們是空格而不是製表符?看起來像「可以」是一個選項卡分隔文件?

對於browie點,你應該使用String.Empty而不是''進行比較,顯然它的本地化和內存更友好。

+0

不,他們不是標籤如果你移動光標左或右,只有一個空間移動,而不是一個選項卡 – seedg

2

這些實際上是空間分隔還是真的固定寬度列?

通過我的意思是做「列」開始在每個情況下的字符串在相同的索引 - 從你描述的數據的方式是後來的聲音,即ID列始終是39列7個字符。

在這種情況下,你需要一個)拉用適當的子電話爲你已經在做,然後列,使用「串」 .Trim()來切斷空間。

如果行,是的,因爲它似乎固定,那麼你不想使用分割的。

+0

他們明星噸在同一指數。我通過分割地址等來實現它,並在末尾添加一些額外的空格,然後修剪結束以刪除空格。 謝謝大家:) – seedg

0

第一種方法將是 - 如已經提及的 - 具有限定令牌作爲字段分隔一個CSV狀結構。

第二個將是固定字段長度,所以你知道第一列從炭1變爲炭20,從炭21的第二列到char 30,依此類推。 這個概念沒有什麼不好,除了人的可讀性可能很差,如果列填充到最大,所以他們之間沒有空間。

您可以編寫一個幫助函數或類,它知道字段長度並提供對特定列的基於索引的容錯訪問。該函數將提取特定的字符串部分並刪除前導空格和尾部空格,但保留原來的空格。

+0

它們都是從文本文件中的相同索引開始的。我唯一存在的問題是名稱和地址顯然不是相同的長度。我通過設置長度爲40的名字的子串來解決這個問題(因爲這個地址會有大約300個空格),所以它不會引起問題。然後,我修剪結束去除空白 – seedg

0

如果你的值有固定的寬度,最好不要分割它,而是在你的數組中使用正確的索引。

const string input = "John Doe  Villa Grazia   323334I"; 
var name = input.Substring(0, 15).TrimEnd(); 
var place = input.Substring(16, 38).TrimEnd(); 
var cardId = input.Substring(39).TrimEnd(); 

假設你的值不能包含在其中兩個連續的空間,我們也許可以用「」(雙空間」作爲分隔符?
下面的代碼基礎上翻一番空間將分割你的字符串

const string input = "John Doe  Villa Grazia   323334I"; 
var entries = input.Split(new[]{" "}, StringSplitOptions.RemoveEmptyEntries) 
       .Select(s=>s.Trim()).ToArray(); 
string name = entries[0]; 
string place = entries[1]; 
string idCard = entries[2]; 
+0

如果這些假設都不是真的,你一定會處於一個痛苦的世界 –

+0

這就是我所做的。順便說一句...謝謝大家。 OMG這個網站太棒了! Huuuge支持!恥辱我不能投票給你們,因爲我不是在聲望上的第15級...... – seedg

+0

嘿,這個網站是驚人的。歡迎來到俱樂部 ;) –

相關問題