PowerShell แฟ้ม csv แฟ้มการแปลงข้อผิดพลาดเนื่องจากพิวเตอร์กับต่างออก DateTime รูปแบบที่แฟ้มนำเข้า

0

คำถาม

ฉันกำลังใช้ PowerShell กับสคริปต์ที่จะแปลงมี.แฟ้ม csv ดิบข้อมูลของแฟ้มเข้าไปมากก manageable รูปแบบข้อมูลแยกกับคอลัมน์เป็นเครื่องมือทำความสะอาดมุมมองเป็นต้น แล้วเพราะแฟ้มต้นทางกับข้อมูลอยู่ในพวกเราวันและเวลารูปแบบ(e.g. 11/23/21,1:00 PM)แล้วถ้าผู้พิวเตอร์อยู่ในที่เดียวกันพวกเรารูปแบบในการแปลงโพรเซสทำงานดีเท่าที่ควรกับ 0 เกิดข้อผิดพลาด. แต่ถ้าผู้พิวเตอร์คือในมุมมองที่ต่างออกประเทศวันที่และเวลาแบบนั้น PowerShell แสดงข้อผิดพลาดในสีแดงอยู่ในระหว่างการโจรกรรม

ตอนที่พิวเตอร์อยู่ในอีก DateTime รูปแบบฉันเห็นหลักเกิดข้อผิดพลาดคือ:

"การวิเคราะห์"กับ"1"เถียงกัน(วินาที):"ข้อความไม่จำเป็นที่ใช้งานได้ DateTime."

และปัญหาคือคนพิวเตอร์อยู่ไหนเรื่องนี้จะถูกใช้ไม่ได้อยู่ในพวกเรารูปแบบ(เดียวที่เปลี่ยนให้พวกเรารูปแบบสำหรับการทดสอบ)ดังนั้นเป็นไปได้มั้ยที่ใครบางคนจะได้ที่นี่โปรดช่วยฉันด้วยที่อยากจะเพิ่มการแปลงโพรเซสที่ไวยากรณ์หรือลงโทษ/วินาทีที่จะง่ายสำหรับกำหนดโดยตรงในการหัสเป็นซ่อมรูปแบบอย่างทรมานจนทำให้เป็นรูปแบบส่งออกรูปแบบโดยอิสระจากกันเรื่องพิวเตอร์นาฬิกาวันและเวลารูปแบบแล้วและถ้าใครคนใดคนหนึ่งของ inputs เข้าไปในแฟ้ม"11/23/21,1:00 PM"แล้วสำหรับกำหนดอยู่ในนรหัสคุณต้องการแสดงผลในรูปแบบ"dd กองทัพรับจ้างเอกชน yyyy hh:mm" จะต้องเป็นผลมาจากการพยากรณ์เหมือน"23-พ.ย.-202101:00 PM"

รหัสส่วนในสคริปต์ที่จะใช้สำหรับการแปลงเป็น:

…
$data = $csvData | ? {$_ -match "\(DTRE"}

dtreFileData = New-Object System.Collections.Generic.List[PSCustomObject]

foreach ($item in $data)
{
  $null = $item.Strategy -match "\(DTRE\|(.*)\)"
  $v = $Matches[1] -split '\|'

  $resultvalue = $v[0] | Convert-CurrencyStringToDecimal
  $expectedvalue = $v[1] | Convert-CurrencyStringToDecimal

  $dtreData = [PSCustomObject]@{
    'DateTime' = ([datetime]::Parse($item.'Date/Time'))
    'ResultValue' = [decimal]$resultvalue
    'ExpectedValue' = [decimal]$expectedvalue
    }
  
  $null = $dtreFileData.Add($dtreData)
  $null = $dtreAllData.Add($dtreData)
}

$dtreFileData | Export-Csv -Path (Join-Path (Split-Path -Path $f -Parent) ($outFile + '.csv')) -Force -NoTypeInformation -Encoding ASCII
…

ตัวอย่างของดิบแหล่งข้อมูล(ในซีวีเอสแฟ้มเป็นคนมาเป็นเบือนบรรทัดชอบต่อหนึ่ง):

...(DTRE|49.0|48.2);...;11/23/21, 12:58 PM...;

...(DTRE|52.1|52.0);...;11/23/21, 1:00 PM...;

...

...

และผลส่งออกดูเหมือนว่า:

enter image description here

ฉันพยายามกับ DateTime ตัวอย่างในอีกกัปตัน..เสาทางนี้จากที่นี่(stackoverflow.com)เพื่อปรับแก้รหัสที่จะทำงานในพิวเตอร์โดยไม่มีพวกเราวันและเวลารูปแบบและจะได้ DateTime รูปแบบผลลัพธ์ถูกระบุไว้ด้านบน ตัวอย่างเช่น:

'DateTime' = ([datetime]::Parse($item.'yyyy-MM-dd:HH:mm:ss'))

'DateTime' = ([datetime]::ParseExact($item.'yyyy-MM-dd:HH:mm:ss'))

…
$culture = [Globalization.CultureInfo]::InvariantCulture
…
  'DateTime' = ([datetime]::ParseExact($item.'yyyy-MM-dd:HH:mm:ss', $culture))
…

แต่กับพวกตัวอย่าง PowerShell แสดงข้อผิดพลาด"ไม่สามารถให้พวกเถียงกันต้องพารามิเตอร์'InputObject'เพราะมันคือโพรโทคอล aimcomment"

ปรับปรุงหลังจากคำตอบจาก@เย็นไว้ไรอันเก็บไว้ก่อน

เมื่อพยายามต่อไปทำการแก้ไขของรหัสกับผู้พิวเตอร์ของระบบรูปแบบวันที่อยู่ใน"ก 24 พ.ย.-21"และส่วนที่เหลือทิ้งไปที่ด้านบน:

…
$resultvalue = $v[0] | Convert-CurrencyStringToDecimal
$expectedvalue = $v[1] | Convert-CurrencyStringToDecimal
$cultureInfo= New-Object System.Globalization.CultureInfo("es-ES")

$dtreData = [PSCustomObject]@{
  'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo))
  'ResultValue' = [decimal]$resultvalue
  'ExpectedValue' = [decimal]$expectedvalue
…

งั้น,PowerShell แสดงต่อข้อผิดพลาด: enter image description here

datetime powershell
2021-11-23 21:14:34
1

คำตอบที่ดีที่สุด

1

อย่างที่มันถูกอธิบายมันเป็นความคิดที่ดีที่จะแก้ไขแฟ้ม csv ก dateformat. เป็นตัวอย่างจะเป็น ISO 8601 ซึ่งสามารถใช้กับ Get-Date -Format "o".

นั่นบอกว่า ทางเดียวที่จะช่วยฉันเดท relies บ C#งอยู่เบื้องหลัง ดังนั้นคุณสามารถใช้ C#รหัสอ่าน ที่อยู่ในวัฒนธรรมพิเศษ. อย่างที่คุณรู้จักดั้งเดิมของวัฒนธรรมนี่จะทำงานแล้ว แก้ไขวันที่และเวลายังคงความคิดที่ดีกว่านั้น

$cultureInfo= New-Object System.Globalization.CultureInfo("en-US")
$dateString = "11/23/21, 12:58 PM";
$dateTime = [System.DateTime]::Parse($dateString, $cultureInfo);
Get-Date -Format "o" $dateTime

กับเรื่องนี้ตัวอย่างเช่นรหัสคุณจะกำหนด $dateString ค่าของ $item.' Date/Time' และผลคุณจะต้องการจะเป็นผลของ Get-Date. ดังนั้นคุณกำหนด $dtreData.'DateTime' ผลของมัน Get-Date โทรมา อีกทางเลือกมันเป็นไปได้ที่จะใช้.เน็ DateTime วัตถุต้องโดยตรงแปลงเป็นพิเศษวัฒนธรรม. สำหรับตัวอย่างโดยโทรหา $dateTime.ToString((New-Object System.Globalization.CultureInfo("en-ES"))). แม้ว่าจะไม่ทั้งหมดนั่นเป็นประโยชน์เธออาจจะส่งรูปแบบแสดงตัวที่นี่วิธีการ. นี่อาจจะเป็นที่เกี่ยวข้องถ้าคุณต้องการจะหลีกเลี่ยงการสร้างเพิ่มเติมวัตถุ. ค่อนข้างจะไม่จำเป็นต้องโทรหาค $dateTime.ToString("o", (New-Object System.Globalization.CultureInfo("en-ES"))) (ตัวอย่างเช่นรูปแบบโอคือคนเดียวกันในทุกๆวัฒนธรรม).

2021-12-01 06:41:00

ขอบคุณสำหรับปฏิกิริยาของคุณ@เย็นไว้ไรอันเก็บไว้ก่อนแต่ไม่มีทางออกเลย ฉันพยายามดัดแปลงแก้ไขกับบรรทัดของคุณแต่ฉันยังไม่สามารถเอาวันและเวลาในรูปแบบกำหนดโดยตรงเข้ารหัสบอกว่า"เอาทุก DateTime ค่าอยู่ในแฟ้ม csv แฟ้มนำเข้าและแปลงพวกเขาต้องรูปแบบ dd-MMM-yyyy hh:mmหรือสำหรับตัวอย่างเช่นเพื่อนที่ชื่อของวัฒนธรรม es-ESหรือบางอย่างที่คล้ายกัน",i.e. ถูกกำหนดโดยตรงในการหัสเป็นรูปแบบสากล/ทั่วไปทางไหนมันทำงานโดยไม่คำนึงถึงถ้าผู้พิวเตอร์อยู่ในภาษาอังกฤษวันและเวลารูปแบบหรือถ้าพิวเตอร์ในวิชาภาษาสเปนวันและเวลารูปแบบหรือถ้าพิวเตอร์เป็นภาษาฝรั่งเศสรูปแบบวันที่และเวลา
adiario

กับบรรทัดของคุณฉันพยายามต่อไปทำการแก้ไขของรหัสกับผู้พิวเตอร์ของระบบวันที่พวกเรารูปแบบ: $resultvalue = $v[0] | Convert-CurrencyStringToDecimal $expectedvalue = $v[1] | Convert-CurrencyStringToDecimal $cultureInfo= New-Object System.Globalization.CultureInfo("en-US") $dtreData = [PSCustomObject]@{ 'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo)) 'ResultValue' = [decimal]$resultvalue 'ExpectedValue' = [decimal]$expectedvalue } และการแปลงทำงานโดยไม่มีข้อผิดพลาด,แต่ให้ผลในรูปแบบ&ถูกต้องขึ้นอยู่กับค O วันที่รูปแบบ
adiario

ฉันยังพยายามต่อไปทำการแก้ไขของรหัสกับผู้พิวเตอร์ของระบบรูปแบบวันที่อยู่ใน"ก 24 พ.ย.-21": …$resultvalue = $v[0] | Convert-CurrencyStringToDecimal $expectedvalue = $v[1] | Convert-CurrencyStringToDecimal $cultureInfo= New-Object System.Globalization.CultureInfo("es-ES") $dtreData = [PSCustomObject]@{ 'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo)) 'ResultValue' = [decimal]$resultvalue 'ExpectedValue' = [decimal]$expectedvalue และตอนนี้ PowerShell ทำให้เกิดข้อผิดพลาดบอกว่า:"ส่งออก-แฟ้ม csv:ไม่สามารถให้พวกเถียงกันต้องพารามิเตอร์'InputObject'เพราะมันคือโพรโทคอล aimcomment"
adiario

เรื่อง Get-Date -Format "o" $dateTime ฉันไม่รู้จริงๆไหนจะมันอยู่ในที่ส่งรหัสในคำถาม ฉันพยายามจะใส่มันอยู่ในสถานที่ที่เหมือนในสุดท้ายหรือหลังจากนั้น 'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo))หรือมัวแต่ PowerShell ทำให้เกิดข้อผิดพลาด. เรื่อง $dateString = "11/23/21, 12:58 PM"; ฉันไม่ได้ใช้มันส่วนหนึ่งเพราะว่าฉันเห็นมันจะเป็นข้อมูลตัวอย่างเช่นในกรณีนี้คือข้อมูล DateTime ค่าอยู่แล้วในแฟ้ม csv แฟ้มนั่นเป็นค่าที่ต้องการที่จะทำงานอยู่
adiario

ในกรณีที่คุณรู้ว่า@เซ็ธ,คุณช่วยแก้ไขรหัสโพสในคำถามอยู่เหนือและเพิ่มมันต้องการการแก้ไขมีผลฉันต้องการสำหรับวันและเวลา ขอบคุณมากสำหรับเวลาของคุณ!
adiario

คุณกำลังสร้างเป็น datetime วัตถุกับเจาะจงวัฒนธรรม. คุณต้องการของคุณ $dtreData ต้องเป็น Get-Date -Format "o" $dateTime. เป็ Get-Date ใช้ $dateTime เป็นข้อมูลน่าจะใช้ของคุณธรรมดาถานที่ อีกทางเลือกคุณในข้อบังคับกำหนดค่าท้องถิ่นต้องส่งออก e.g. ใช้ $localDT.ToString((New-Object System.Globalization.CultureInfo("en-ES"))).
Seth

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................