2017-07-04 82 views
0

我有文件,我通過」,「分隔值 - 但它不是.csv擴展名。
我試圖從各行,從0從文件中讀取值12次後,「

開始要這筆錢在C#和得到的,應該始終把價值12後「」

0,P2CZ,1,0,400,400,802,802,18,18,1299,,5,248721,2487221,2 
1,1,2487221,1,1_EG_3ST2_1/22,,0,460,18,0 
0,,2,0,400,400,982,982,18,18,13999,,9,2321,248731,24878/121,24872021,,,,,, 
1,1,2482021,1,1_EG_9_ST2_1/22,,0,460,18,0 
1,3,2487821,1,1_EG_U9_ST2_1/22,,0,1042,18,0 
1,4,248781,1,1_EG_U9_ST2_1/22,,0,1042,18,0 
0,,3,0,2000,2000,80,80,18,18,14/0999,,1,,,,,,,,,,2000,80,1.3,,,,0,0,,, 

所以在這種風格:

  • 1行12後 「」 是值 「5」,
  • 第二排跳過,因爲在1月初,
  • 第三排,12後「」 是值 「9」,
  • 4-6行跳過,因爲在1月初,
  • 排第7,第12後 「」 是值 「1」

所以總和5 + 9 + 1 = 15.

我已經輸入了讀取的行,其中包含從標籤和+擴展名獲取的補丁+數據。

但接下來呢?我應該如何處理?

int count = File.ReadLines(patch + label97.Text + ".ext").Count(line => !line.All(char.IsWhiteSpace)); 

回答

0

對於初學者來說,你應該做這個

var desiredPart = line.Split(new[] { ',' })[11]; // get whatever is at the twelveth position 
int value = int.Parse(desiredPart); 

當然,你需要檢查的分割實際上給你12個職位,是否是一個數字。

+0

正如我在評論中提到,我建議OP用你的方法,但與分裂線的其他檢查。我在手機上,所以我不能給他一個例子... – Nino

0

您應該首先對字符','執行字符串拆分並將拆分字符串保存爲數組。然後你可以訪問第0個元素來查看它是0還是1,然後是第12個元素進行求和。然後使用您所選擇的循環語句

File.ReadLines(patch + label97.Text + ".ext") 
    .Where(line => !line.StartsWith("1") // get lines that do not start with 1 
    .ToArray(); 

,:

0

如果我們假設文件是​​正確的格式,並且在每12個位置,你會發現整個號碼,您可以只用一個線(快速和骯髒的)

var sum = File.ReadLines(patch + label97.Text + ".ext") 
    .Where(l =>!l.StartsWith("1")) 
    .Sum(l => int.Parse(l.Split(',')[11]); 

記住這樣做,這將拋出一個異常,如果只有一件事情不符合預期(錯誤的文件名,錯誤的位置,第12個位置的字符串而不是數字等)。

+0

不是說LinQ(除了漂亮)使它很難添加車中正?我看不到如何輕鬆開始使用int。TryParse或檢查它實際上是否有12個位置,而沒有複製拆分部分 –

+0

@CamiloTerevinto正如我所說,這是一種快速而骯髒的解決方案,它假設一切都在其位置。用這種方式解析csv通常是個不好的主意,不要介意Linq。但是,作爲示範,這將做 – Nino

+0

我知道這一點,我只是想看看你是否有任何更多的LinQ技巧:) –

0


如果在這個文件中,對11或12個位置,我有例如不是「16」,而是「1:59」(所以1分59秒?
VS給我的信息與不正確的輸出關於日期的故障排除。
我試圖decimal.Parse和DateTime.TryExact但同樣的問題。

var test2 = File.ReadLines(path + label97.Text + ".ptn") 
    .Where(l => l.StartsWith("SUM1")) 
    .Sum(l => DateTime.ParseExact(l.Split(',')[11]));