Powershell拆分度符号

时间:2017-12-12 21:21:23

标签: powershell split

我以Degrees,Minutes,Seconds格式传递特定字符串(纬度和经度)。有没有办法可以对所有正确符号的字符串进行拆分?我可以拆分'或',但度符号(°)不适用于拆分。是否需要使用变通方法或语法?

我还尝试了Powershell ISE中的转换方法。我可以运行以下命令:

  

[char] 176

并导致度数符号被打印到输出控制台。但是,如果我把它放在脚本中的split参数中,它仍然会给我相同的错误(在数字之间放置一个?并抱怨输入字符串格式不正确)。

以下是我如何解析值的示例:

$gps = $gps.Split("'").Split("°").Split("*").Split("’").Split("""").Split("””").Split("?")

我尝试过更换

  

“°”

通过以下示例:

$degSplit = [char]176 and replacing with $degSplit
[char]176 directly
[char]0x00B0

所有导致相同的错误:

  

无法将值“38 9”转换为“System.Double”类型。错误:“输入   字符串的格式不正确。“

更新: 我按照以下建议尝试了以下语法:

$option = [System.StringSplitOptions]::RemoveEmptyEntries
$separator = " ", "°", "'", "?", "'", '"', '*'
$gps = $gps.Split($separator,$option)
$gpsDec = [double]$gps[0]

我想在里面创建一个值数组,以便更容易将它们转换为十进制表示法。仍然与上述相同。

以下是我输入的值的示例(这些是我要导入的CSV的特定列的坐标):

  

39°26'59.75" N

前面有一个空间。 CSV从另一个应用程序转换而来,学位总共有3个空格,占3位数。这也适用于分钟(2位数,即使它是7位)。

更新2:

刚想了一想。有没有更好的方法来做这个不依赖于语法或unicode翻译?是否可以使用正则表达式或其他一些通用机制来从字符串中提取所有数字并将它们分配给数组的值?迭代字符串的每个字符的东西,如果是数字,则将其应用于$ gps [0],如果下一个是数字,则追加它,如果不是,则在我们到达下一个时移动到$ gps [1]数字数字......依此类推,直到所有字符都被评估。或者这是否过多?不幸的是,在摄取数据之前将它全部转换为电子表格要容易得多,但是我无法控制它。

4 个答案:

答案 0 :(得分:3)

按如下方式应用.NET Split(Char[], StringSplitOptions) method

kernel void updateEnvironmentMap(texture2d<float, access::read> currentFrameTexture [[texture(0)]],
                                 texture2d<float, access::read> coordinateConversionTexture [[texture(1)]],
                                 texture2d<float, access::write> environmentMap [[texture(2)]]
                                 uint2 gid [[thread_position_in_grid]])
{
  const float4 pixel(255, 127, 63, 255);
  environmentMap.write(pixel, gid);
}

<强>输出

$DmsLatitude  = '51° 28′ 38″ N' # Degree Sign, Prime, Double Prime
$DmsLongitude = @'
    51° 28' 38" E
'@.Trim()                       # Degree Sign, Apostrophe, Quotation Mark

$option    = [System.StringSplitOptions]::RemoveEmptyEntries
$separator = " ", "°", "′", "″", "'", '"'
$DmsLatitude.Split($separator,$option) -join ','
$DmsLongitude.Split($separator,$option) -join ','

<# characters commonly used in DMS coordinates
Char CodePoint         Category Description   
---- ---------         -------- -----------   
   ° U+00B0         OtherSymbol Degree Sign
   ′ U+2032    OtherPunctuation Prime
   ″ U+2033    OtherPunctuation Double Prime
   ° U+00B0         OtherSymbol Degree Sign
   ' U+0027    OtherPunctuation Apostrophe
   " U+0022    OtherPunctuation Quotation Mark
<##>

Split(Char[], StringSplitOptions) method的替代(较新)链接

  

语法(C#)

PS D:\PShell> D:\PShell\SO\47781745.ps1
51,28,38,N
51,28,38,E

PS D:\PShell> 
     

参数

[ComVisibleAttribute(false)]
public string[] Split(
  char[] separator,
  StringSplitOptions options
)
     

键入:separator
一个用于分隔的字符数组   此字符串中的子字符串,一个不包含分隔符的空数组,   或null。

System.Char[]
     

输入:options
  StringSplitOptions.RemoveEmptyEntries以省略空数组元素   从数组返回;或StringSplitOptions.None包含空   返回数组中的数组元素。

     

返回值

     

类型:System.StringSplitOptions
一个数组包含的数组   此字符串中由一个或多个字符分隔的子字符串   在分隔符中。有关详细信息,请参阅“备注”部分。

答案 1 :(得分:1)

对我来说很好:

PS C:\> $SplitChars = "'", "’", '"', '”', '°', '*', '?';
PS C:\> $gps = @'
 39°26'59.75"N
'@;
PS C:\> $gps.Split($SplitChars, [System.StringSplitOptions]::RemoveEmptyEntries).Trim();
39
26
59.75
N

在ISE也适合我,虽然ISE确实有一些小怪癖。我在PowerShell 5.0上。

如果格式始终为DDD°DD'DD.DD"A,您可以轻松地进行静态映射:

$gps = @'
 39°26'59.75"N
'@;
$gps[0..2] -join '' -as [Decimal]
$gps[4..5] -join '' -as [Decimal]
$gps[7..11] -join '' -as [Decimal]
$gps[13]

答案 2 :(得分:0)

您可以根据要分割的项目的Char值进行拆分。我相信[char] 248是度。

查看此页面,了解您可以使用的值。 https://www.alt-codes.net/

$a = [char]176
$test = '33°44°55°'
$test -split $a

33
44
55

答案 3 :(得分:0)

在使用社区提供的不同配置和语法版本后,我决定稍微备份并查看输入本身。问题实际上发生在Split方法之前。 import-csv没有为该特定CSV文件使用正确的编码语言。一旦我改变了编码方法:

Import-Csv $global:path'\Spreadsheet.csv' -Encoding Default

我能够正确解析数据。编码将度数符号转换为文字符号? Split方法可以适当识别的字符。我现在的问题是坐标的格式在CSV中不一致,但这是我需要解决的另一个问题。

更新:我将其更改为默认值,如下所述。这样就可以正确编码字符。