PowerShell सीएसवी फ़ाइल रूपांतरण त्रुटियों की वजह से पीसी के साथ अलग अलग DateTime स्वरूप में है कि इनपुट फ़ाइल

0

सवाल

मैं का उपयोग कर रहा हूँ PowerShell के साथ एक स्क्रिप्ट में परिवर्तित करने के लिए एक .सीएसवी कच्चे डेटा फ़ाइल में और अधिक प्रबंधनीय डेटा प्रारूप के साथ अलग-अलग कॉलम, एक क्लीनर आदि. और क्योंकि स्रोत फ़ाइल में कच्चे डेटा में है की हमें तारीख और समय प्रारूप (उदाहरण के लिए 11/23/21, 1:00 PM) है, तो अगर आप पीसी में एक ही है कि हमें प्रारूप रूपांतरण की प्रक्रिया पूरी तरह से चलाता है के रूप में होना चाहिए के साथ 0 त्रुटियों. लेकिन, अगर आप पीसी में एक अलग देश तारीख और समय प्रारूप है, तो PowerShell शो में त्रुटियाँ लाल प्रक्रिया में.

जब पीसी में अन्य DateTime स्वरूप में मैं मुख्य त्रुटि है:

"पार्स" के साथ "1" तर्क(ओं): "स्ट्रिंग नहीं था के रूप में मान्यता प्राप्त एक मान्य दिनांक समय."

और समस्या है, जहां पीसी का उपयोग किया जाएगा नहीं है अमेरिका में प्रारूप (केवल बदल गया है हमें करने के लिए प्रारूप के परीक्षण के लिए), तो किसी ने यहाँ मेरी मदद करने के लिए जोड़ने के लिए रूपांतरण की प्रक्रिया वाक्य रचना या वाक्य/एस करने के लिए बस सीधे निर्दिष्ट कोड में एक तय प्रारूप है कि रहता है एक स्थिर आउटपुट स्वरूप स्वतंत्र रूप से के बारे में पीसी घड़ी की तारीख और समय प्रारूप, और अगर एक इनपुट फ़ाइल में है "11/23/21, 1:00 हूँ" तो फिर में निर्दिष्ट करने के लिए कोड आप चाहते हैं के उत्पादन में प्रारूप "डीडी-एम एम एम-yyyy hh:mm" करने के लिए एक परिणाम की तरह "23-नवम्बर-2021 01: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
…

उदाहरण के कच्चे डेटा स्रोत में (CVS फाइल के दर्जनों रहे हैं लाइनों की तरह अगले एक):

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

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

...

...

और उत्पादन की तरह लग रहा है:

enter image description here

मैं करने की कोशिश की के साथ शब्दकोश उदाहरण में अन्य पदों से यहाँ (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' है, क्योंकि यह अशक्त"

अद्यतन करने के बाद जवाब से @सेठ:

कोशिश कर रहा है जब अगले संशोधन कोड के साथ पीसी प्रणाली तारीख प्रारूप में "24-Nov-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

के रूप में यह समझाया गया है कि यह एक अच्छा विचार है तय करने के लिए सीएसवी के लिए एक बेहतर dateformat. एक उदाहरण होगा आईएसओ 8601 जो इस्तेमाल किया जा सकता है के साथ Get-Date -Format "o".

कहा कि मिल-तारीख पर निर्भर करता है, 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 मान में सीएसवी इनपुट फ़ाइल और उन्हें परिवर्तित करने के लिए प्रारूप dd-MMM-yyyy hh:mmउदाहरण के लिए , या संस्कृति के नाम es-ES, या कुछ इसी तरह", यानी निर्दिष्ट किया जा रहा में सीधे कोड के रूप में एक यूनिवर्सल/सामान्य तरीका है, जहां यह काम करता है, तो परवाह किए बिना पीसी अंग्रेजी में है, तारीख और समय प्रारूप, या अगर आप पीसी में स्पेनिश तारीख और समय प्रारूप, या अगर आप पीसी में फ्रेंच तारीख और समय प्रारूप
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 } और रूपांतरण की त्रुटियों के बिना काम करता है, लेकिन परिणाम देने में हम प्रारूप और जा रहा है पर निर्भर ओएस दिनांक स्वरूप.
adiario

मैं भी करने की कोशिश की अगले संशोधन कोड के साथ पीसी प्रणाली तारीख प्रारूप में "24-Nov-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 त्रुटि देता है कह रही: "निर्यात सीएसवी : बाध्य नहीं कर सकते बहस करने के लिए पैरामीटर 'InputObject' है, क्योंकि यह शून्य"
adiario

के बारे में Get-Date -Format "o" $dateTime मैं वास्तव में, जहां पता नहीं होगा अपनी जगह में प्रकाशित किया गया था कोड में सवाल है । मैं डाल करने की कोशिश की यह कई स्थानों में की तरह, अंतिम पंक्ति में, या के बाद 'DateTime' = ([System.DateTime]::Parse($item.'Date/Time', $cultureInfo))है , या इसे में, लेकिन PowerShell त्रुटि देता है. के बारे में $dateString = "11/23/21, 12:58 PM"; मैं का उपयोग नहीं किया था इस भाग में, क्योंकि मैं यह देखने के लिए किया जाएगा एक इनपुट उदाहरण है और इस मामले में इनपुट DateTime मान रहे हैं पहले से ही में सीएसवी फाइल कर रहे हैं कि मूल्यों की जरूरत है कि किया जा करने के लिए काम किया.
adiario

मामले में आप जानते हैं कैसे @सेठ, तुम सकता है कृपया संशोधित कोड में प्रकाशित किया गया था के सवाल के ऊपर और इसे जोड़ने की जरूरत के संशोधनों के परिणाम के लिए तिथि और समय. बहुत बहुत धन्यवाद आपके समय के लिए!
adiario

तुम पैदा कर रहे हैं एक datetime वस्तु के साथ एक विशिष्ट संस्कृति है । आप चाहते हैं अपने $dtreData किया जा करने के लिए Get-Date -Format "o" $dateTime. एक Get-Date का उपयोग कर $dateTime इनपुट के रूप में का उपयोग भी करना चाहिए नियमित रूप से अपने वातावरण. वैकल्पिक रूप से आप स्पष्ट रूप से परिभाषित स्थान के लिए आउटपुट का उपयोग कर उदाहरण के लिए $localDT.ToString((New-Object System.Globalization.CultureInfo("en-ES"))).
Seth

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में