VB.Net如何从CSV文件中获取日期列的最小、最大日值
问题原因
你当前的代码存在两个核心错误:
Min、Max是面向集合的聚合统计方法,你在单个日期转换得到的dd格式字符串上调用这两个方法,实际是在取字符串中单个字符的最小/最大ASCII值,和提取日期最小值、最大值的需求完全不符。- 每次循环都会直接覆盖两个属性的值,没有做累计比较的逻辑,循环结束后两个属性只会保留最后一行数据的计算结果。
修复方案
你可以先收集所有有效日期的日数值,再统一计算最小最大值,示例代码如下:
' 存储所有提取到的日数值 Dim dayValues As New List(Of Integer)() ' 读取CSV跳过表头 Dim csvLines = IO.File.ReadAllLines("my.csv").Skip(1) For Each line In csvLines Dim cols = line.Split(";"c) ' 用TryParse避免日期格式异常崩溃,可根据实际情况替换为TryParseExact指定日期格式 If Date.TryParse(cols(2), Nothing, Globalization.DateTimeStyles.None, Dim currentDate) Then dayValues.Add(currentDate.Day) End If Next ' 有有效数据时赋值属性,转换为两位字符串格式 If dayValues.Any() Then FirstDayOfCsv = dayValues.Min().ToString("00") LastDayOfCsv = dayValues.Max().ToString("00") End If
如果不想额外存储所有日数值,也可以在循环过程中动态更新最小/最大值:
Dim minDay As Integer = Integer.MaxValue Dim maxDay As Integer = Integer.MinValue Dim csvLines = IO.File.ReadAllLines("my.csv").Skip(1) For Each line In csvLines Dim cols = line.Split(";"c) If Date.TryParse(cols(2), Nothing, Globalization.DateTimeStyles.None, Dim currentDate) Then Dim currentDay = currentDate.Day minDay = Math.Min(minDay, currentDay) maxDay = Math.Max(maxDay, currentDay) End If Next If minDay <= maxDay Then FirstDayOfCsv = minDay.ToString("00") LastDayOfCsv = maxDay.ToString("00") End If
补充说明
如果CSV中的日期格式不是系统默认格式,建议使用Date.TryParseExact指定确切的格式,避免解析失败,例如CSV日期格式为yyyy/MM/dd时,写法如下:
Date.TryParseExact(cols(2), "yyyy/MM/dd", Nothing, Globalization.DateTimeStyles.None, currentDate)
内容的提问来源于stack exchange,提问作者Иван Олександров
相关产品推荐
相关产品推荐

