要将3个IP地址逗号分隔值的文本文件加载到数组中,然后在ip地址的每个第3个八位字节中更改数组中的内容,然后将其导出回csv或文本文件。
foobar = session.query(FoobarModel).get(foobar_id)
props = {'name': 'my new name'}
for key, value in props.items():
setattr(foobar, key, value)
session.commit()
session.flush()
成功将数据导出到csv文件。 而是一个空的csv文件。
##load file to an array
$ipFileName="C:\Users\HarmanGrewal\Google Drive\win213\assignment2\IP.txt"
$array1=@()
$array1=Get-Content $ipFileName -Delimiter ","
#now we have the contents in an array
$count=0
foreach($i in $array1){
$array1[$count] = $array1[$count] -replace "\.\d{1}\.",".2."
$count++
}
Get-Content $array1 | export-csv -path "C:\Users\HarmanGrewal\test.txt"
答案 0 :(得分:1)
首先,如果你在这里使用foreach
,则不需要$count
变量。第二件事就在你的最后一行,你将集合$array1
传递给Get-Content
。它将路径作为参数。所以它试图将文件的内容存储在$array1
,这是不正确的。
请修改如下代码。
$ipFileName="C:\Users\HarmanGrewal\Google Drive\win213\assignment2\IP.txt"
$array1=@()
$array1=Get-Content $ipFileName -Delimiter ","
#now we have the contents in an array
foreach($i in $array1){
$i = $i -replace "\.\d{1}\.",".2."
$i
}
$array1 | export-csv -path C:\Users\HarmanGrewal\test.txt
答案 1 :(得分:1)
# Read the 3 IP addresses from the input file into an array.
# .TrimEnd() ensures that a trailing newline, if any, is stripped (syntax requires PSv3+)
$ips = (Get-Content $ipFileName -Delimiter ",").TrimEnd()
# Replace single-digit IP octets with fixed value 2,
# join the resulting IPs with ',' again, and write to an output file.
$ips -replace '\.\d{1}\.', '.2.' -join ',' | Set-Content "C:\Users\HarmanGrewal\test.txt"
至于您尝试的内容:
$array1=@()
$array1 = ...
$array1=@()
没有意义,因为下一行再次分配给$array1
,这意味着其 RHS确定了{{的数据类型1}},与之前的$array1
任务无关;
如果=@()
命令恰好返回单个值,Get-Content
将是标量;您可以通过将$array1
命令放在Get-Content
数组子表达式运算符中,但在PSv3 +中通常不需要,因为它统一处理了标量和集合。
@(...)
枚举数组元素本身,其中foreach($i in $array1)
是每个数组元素的按值副本。
而不是使用单独的$i
变量通过索引通过引用访问元素以便更新它们,而PowerShell允许您简单地重新创建整个数组:
$count
或者更简洁地说,依赖于$array1 = foreach ($el in $array1) { $el -replace "\.\d{1}\.",".2." }
运算符对数组值LHS值的支持:
-replace
当Harsh Jaswal's answer指出时,$array1 = $array1 -replace "\.\d{1}\.",".2."
错误地传递了目标文件内容,而Get-Content $array1
期望 filename 参数读取内容来自。
由于输出的值 - 在数组Get-Content
中 - 已经在内存中,您只需通过管道直接发送它们 。
$array1
对对象的属性进行操作,因为您提供的字符串对象只有Export-Csv
属性,所有将被导出的是该属性,这不是意图。
在目前的情况下,您必须使用.Length
基于在内存中构建CSV格式的字符串,直接编写文本文件。
请注意,Set-Content
使用系统的遗产" ANSI"代码页默认;使用Set-Content
来改变它。