function isAssoc($array) {
$array = array_keys($array);
return ($array !== array_keys($array));
}
if (isAssoc($ONEANSWER['answers']['answer'])) {
$ONEANSWER['answers']['answer'] = [$ONEANSWER['answers']['answer']];
}
if (isAssoc($THREEANSWERS['answers']['answer'])) {//it's not associative array
$THREEANSWERS['answers']['answer'] = [$THREEANSWERS['answers']['answer']];
}
使用 isassoc
这是我写的一些代码,以演示如何做到这一点。我创建了一个 filedownloader
类,因为下载完成后,您可以获取源URL和目标文件名。我还添加了一个进度活动。仅使用 webclient
类的问题是,您将失去在事件中正在处理哪个文件的跟踪。
Imports System.ComponentModel
Imports System.Net
' A class for downloading files, with progress and finished events
Public Class FileDownloader
' Private storage
Private FileURL As String = ""
Private SaveToPath As String = ""
' A class to return our result in
Public Class FileDownloaderFileDownloadedEventArgs
Public Property DownloadedURL As String
Public Property SaveToPath As String
Public Sub New(DownloadedURL As String, SaveToPath As String)
Me.DownloadedURL = DownloadedURL
Me.SaveToPath = SaveToPath
End Sub
End Class
' A class to show progress
Public Class FileDownloaderProgressEventArgs
Public Property DownloadURL As String
Public Property SaveToPath As String
Public Property TotalBytes As Long
Public Property ProgressBytes As Long
Public Property ProgressPercent As Integer
Public Property UserState As Object
Public Sub New(DownloadURL As String, SaveToPath As String, TotalBytes As Long, ProgressBytes As Long, ProgressPercent As Integer, UserState As Object)
Me.DownloadURL = DownloadURL
Me.SaveToPath = SaveToPath
Me.TotalBytes = TotalBytes
Me.ProgressBytes = ProgressBytes
Me.ProgressPercent = ProgressPercent
Me.UserState = UserState
End Sub
End Class
' The event to raise when the file is downloaded
Public Event FileDownloaded(sender As Object, e As FileDownloaderFileDownloadedEventArgs)
' The event to raise when there is progress
Public Event Progress(sender As Object, e As FileDownloaderProgressEventArgs)
' Pass in the URL and FilePath when creating the downloader object
Public Sub New(FileURL As String, SaveToPath As String)
Me.FileURL = FileURL
Me.SaveToPath = SaveToPath
End Sub
' Call Download() to do the work
Public Sub Download()
Using wc As New WebClient
AddHandler wc.DownloadFileCompleted, AddressOf DownloadFileCompleted
AddHandler wc.DownloadProgressChanged, AddressOf DownloadProgressChanged
wc.DownloadFileAsync(New Uri(FileURL), SaveToPath)
End Using
End Sub
' Catch the download complete and raise our event
Private Sub DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
RaiseEvent Progress(Me, New FileDownloaderProgressEventArgs(FileURL, SaveToPath, e.TotalBytesToReceive, e.BytesReceived, e.ProgressPercentage, e.UserState))
End Sub
Private Sub DownloadFileCompleted(sender As Object, e As AsyncCompletedEventArgs)
' Some code you want to run after each file has downloaded
RaiseEvent FileDownloaded(Me, New FileDownloaderFileDownloadedEventArgs(FileURL, SaveToPath))
End Sub
End Class
#Region "How to use the FileDownloader class"
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
' Loop the URLs in the ListBox
For Each item In ListBox1.Items
' Create a FileDownloader object to handler each one
Dim FD = New FileDownloader(item, "c:\temp\" & IO.Path.GetFileName(item))
' Attach the event handlers
AddHandler FD.FileDownloaded, AddressOf FileDownloaded
AddHandler FD.Progress, AddressOf Progress
' Start the download
FD.Download()
Next
End Sub
' Event handler for file download completed
Private Sub FileDownloaded(sender As Object, e As FileDownloader.FileDownloaderFileDownloadedEventArgs)
tb_Log.AppendText(e.DownloadedURL & " Downloaded To: " & e.SaveToPath & vbCrLf)
End Sub
' Event handler for progress
Private Sub Progress(sender As Object, e As FileDownloader.FileDownloaderProgressEventArgs)
tb_Log.AppendText(IO.Path.GetFileName(e.DownloadURL) & " " & e.ProgressPercent & "% downloaded" & vbCrLf)
End Sub
#End Region
我初始化了一个2-d数组(
n行 * 2 cols
),我想通过std :: Sort
[...]
排序总是2,然后您应该使用
在这里作为合适的数据结构。
这将有助于通过简单地进行比较 std:
std:
std: :配对
。
示例使用 std :: pair&lt&lt>
的数组,您可以做
std::pair<int, int> ministers[1010]; // array of pair of ints
int n; std::cin >> n;
for (int i = 0; i < n; i++)
std::cin >> ministers[i].first >> ministers[i].second;
// compare function is a lambda
std::sort(ministers, ministers + n
, [](const auto& m1, const auto& m2) { return m1 < m2; });
// use of std::pair<int, int>::operator< --> ^^^^^^^^^^^^^^^
考虑单纯词的一种方法是,它不会创建对象包含它被解析的XML,它只是为提供了访问xml内部数据的API。因此,要使用它,您需要了解XML的结构,并确定要从中获得哪些数据。
在这种情况下, XMLNS
属性代表 XML名称空间,因此您需要了解如何与这些空间一起工作,这将在此处进行详细讨论: Reference-我如何处理名称空间(标签和属性的标签和属性,以其名称为单位) Simplexml?。
您实际上并没有说出要出去的数据,因此我将以示例作为示例获取符号从股票元素的内部列表中获取符号。要了解这些,您需要遍历:
-
&lt; diffgr:diffgram&gt;
元素,命名空间中的urn:schemas-microsoft-com:xml-diffgram-v1
如其xmlns所示:diffgr
属性 - ofter
&lt; ticker&gt;
element,在命名空间中,带有空的URI(xmlns =“”
) - 循环
- Inner
&lt; ticker&gt;
元素,我们希望通过&lt; symbor&gt ;
每个元素,我们要提取字符串内容的元素,
$sx = simplexml_load_string($xml); // Note: no additional options needed here
// Switch to the namespace given by xmlns:diffgr=""...", and select the "diffgram" element
$diffgram = $sx->children('urn:schemas-microsoft-com:xml-diffgram-v1')->diffgram;
// Switch to the namespace with an empty URI, because the elements have xmlns=""
$emptyNamespaceChildren = $diffgram->children("");
// Select the outer Ticker element
$outerTicker = $emptyNamespaceChildren->Ticker;
// Loop over the inner Ticker elements
$symbols = [];
foreach ( $outerTicker->Ticker as $ticker ) {
// Get some data out, in this case the SYMBOL of each Ticker
// Using (string) gives us the content of the element, rather than an object
$symbols[] = (string)$ticker->SYMBOL;
}
请注意,这里的所有额外变量仅用于可读性,实际上,您可能不会说服它。在另一个极端上,您可以将其全部放在一条线上,贯穿所有级别,直到到达想要循环的部分,如下:
$sx = simplexml_load_string($xml);
$symbols = [];
foreach ( $sx->children('urn:schemas-microsoft-com:xml-diffgram-v1')->diffgram->children("")->Ticker->Ticker as $ticker ) {
$symbols[] = (string)$ticker->SYMBOL;
}
在Python中代表您的伪代码的最PYTHONIC方式是:
x = 0
y = 1
z = 3
mylist = []
if any(v == 0 for v in (x, y, z)):
mylist.append("c")
if any(v == 1 for v in (x, y, z)):
mylist.append("d")
if any(v == 2 for v in (x, y, z)):
mylist.append("e")
if any(v == 3 for v in (x, y, z)):
mylist.append("f")
我最终尝试了词典列表,并在更快的情况下进行此任务的性能。
dict_list = df.to_dict('records')
dict_length = len(dict_list)
duplicate_flag = False
i = 0
trim_value = 0.005
data = []
for j in range(dict_length - 1):
for k in range(dict_length - 1):
if k >= i:
if(dict_list[i]['Running Date'] == dict_list[k+1]['Running Date'] and
dict_list[i]['Category'] == dict_list[k+1]['Category'] and
dict_list[i]['Location From'] >= (dict_list[k+1]['Location From'] - trim_value) and
dict_list[i]['Location From'] <= (dict_list[k+1]['Location From'] + trim_value) and
dict_list[i]['Location To'] >= (dict_list[k+1]['Location To'] - trim_value) and
dict_list[i]['Location To'] <= (dict_list[k+1]['Location To'] + trim_value)):
duplicate_flag = True
if duplicate_flag == False:
data.append(dict_list[i])
i += 1
duplicate_flag = False
data.append(dict_list[-1])
df2 = pd.DataFrame(data)
如果您想将json(本质上是文本)转换为python dict,那么我建议您使用以下方式:
**
import json
# some JSON:
x = '{ "name":"John", "age":30, "city":"New York"}'
# parse x:
y = json.loads(x)
# the result is a Python dictionary:
print(y["age"])
**
,然后您可以调用y ['键'] =使用数据的值
在这里,y ['name'] =“约翰”
如
https://github.com/mkleeehammer/pyodbc/pyodbc/issues/383
pyodbc返回位
列作为布尔值,因为这是大多数人使用的位
列。
import pandas as pd
import sqlalchemy as sa
engine = sa.create_engine("mssql+pyodbc://scott:tiger^5HHH@mssql_199")
table_data = """\
SELECT -1 AS id, CAST(NULL AS bit) AS bit_col
UNION ALL
SELECT 0 AS id, CAST(0 AS bit) AS bit_col
UNION ALL
SELECT 1 AS id, CAST(1 AS bit) AS bit_col
"""
df = pd.read_sql_query(table_data, engine)
print(df)
"""
id bit_col
0 -1 None
1 0 False
2 1 True
"""
如果您希望PYODBC返回 bit
列作为其他类型,则可以使用GitHub问题中所示的输出转换器函数。诀窍是让Sqlalchemy使用它。这是使用事件侦听器完成的。
import pandas as pd
import pyodbc
import sqlalchemy as sa
engine = sa.create_engine("mssql+pyodbc://scott:tiger^5HHH@mssql_199")
table_data = """\
SELECT -1 AS id, CAST(NULL AS bit) AS bit_col
UNION ALL
SELECT 0 AS id, CAST(0 AS bit) AS bit_col
UNION ALL
SELECT 1 AS id, CAST(1 AS bit) AS bit_col
"""
def handle_bit_type(bit_value):
return bit_value
@sa.event.listens_for(engine, "connect")
def connect(conn, rec):
conn.add_output_converter(pyodbc.SQL_BIT, handle_bit_type)
df = pd.read_sql_query(table_data, engine)
print(df)
"""
id bit_col
0 -1 None
1 0 b'\x00'
2 1 b'\x01'
"""
编辑:或,如果您
def handle_bit_type(bit_value):
if bit_value is None:
rtn = None
elif bit_value == b"\x00":
rtn = "0"
else:
rtn = "1"
return rtn
使用
df = pd.read_sql_query(table_data, engine)
print(df)
"""
id bit_col
0 -1 None
1 0 0
2 1 1
"""
看来您忘了在tsconfig.json中添加“页面”目录中的绝对路径映射。
尝试将其添加到您的tsconfig.json
{...
"paths": {
... other paths mappings
"@pages/*": ["pages/*"],
...
}
您必须使用最新的APIM 4.1.0的U2级进行迁移,因为它包含迁移所需的一些更改。这些更改在GA版本中不可用(从网站或GitHub下载)。
如果您有WSO2订阅,则可以使用U2工具[1]将4.1.0更新为最新版本。
使用 sed
非常适合精确的模式匹配,但是对于比较“大于”或“小于”的值,您可能会发现使用 grep
或 awk更容易
。例如,给定输入(日期和amp;时间之间的空间,将时间戳与日志输入分开的选项卡):
$ cat foo.txt
22/06/23 19:30:21 [Logs ... 5]
22/06/24 17:58:30 [Logs ... 4]
22/06/24 17:59:48 [Logs ... 3]
22/06/24 18:11:27 [Logs ... 2]
22/06/24 18:11:28 [Logs ... 1]
您可以使用 sed
,如其他答案所示(我将扩展到 awk
比较):
$ sed -n '\#22/06/24 17:58:30#, \#22/06/24 18:11:27#p' foo.txt
22/06/24 17:58:30 [Logs ... 4]
22/06/24 17:59:48 [Logs ... 3]
22/06/24 18:11:27 [Logs ... 2]
基本上是:
$ sed -n '/pattern1/, /pattern2/p' file.txt
请注意需要将/stateres1/,/stater2/
更改为允许斜杠的东西(/
)的棘手部分在搜索模式中。选择最适合您的数据的方法。我在这里使用#
。
使用 awk
差不多,除了搜索模式中允许/
有所不同。因此,
$ awk -F'\t' '/pattern1/, /pattern2/' file.txt
成为为了在模式中允许/
允许/
:
$ awk -F'\t' '$0~v1, $0~v2' v1="pattern1" v2="pattern2" file.txt
但这仅与两个模式之间的界线匹配,并且模式必须完全匹配。我们可以像字母数字一样对待时间戳,而匹配“大于 staters1
到线上”的行小于“ staters2 :
$ awk -F'\t' '$1>=v1 && $1<=v2' v1="22/06/24 17:58:30" v2="22/06/24 18:11:27" foo.txt
22/06/24 17:58:30 [Logs ... 4]
22/06/24 17:59:48 [Logs ... 3]
22/06/24 18:11:27 [Logs ... 2]
但这是一个字母数字的比较,因此您可以使用其他日期(例如搜索模式:
$ awk -F'\t' '$1>=v1 && $1<=v2' v1="22/06/24 00:00:00" v2="22/06/24 18:00:00" foo.txt
22/06/24 17:58:30 [Logs ... 4]
22/06/24 17:59:48 [Logs ... 3]
您可以切换&gt; =
and &lt; =
只需简单&gt;
和&lt; < /代码>取决于您是否要包含给定日期。
我建议改用年份转换为角色。这应该与传单一起使用。
## Libraries
library(dplyr)
library(lubridate)
df$USER_Year1 = as.character(df$USER_Year)
str(df)
输出
> df$USER_Year1
[1] "2022" "2021" "2022" "2022" "2022" "2022" "2022" "2022" "2022" "2022"
> df
USER_Date USER_Year USER_Month USER_Day USER_Year1
1 2022-01-04 2022 1 4 2022
2 2021-01-06 2021 1 6 2021
3 2022-01-19 2022 1 19 2022
4 2022-01-20 2022 1 20 2022
5 2022-01-24 2022 1 24 2022
6 2022-01-27 2022 1 27 2022
7 2022-01-28 2022 1 28 2022
8 2022-01-19 2022 1 19 2022
9 2022-01-31 2022 1 31 2022
10 2022-01-31 2022 1 31 2022
> str(df)
'data.frame': 10 obs. of 5 variables:
$ USER_Date : Date, format: "2022-01-04" "2021-01-06" "2022-01-19" "2022-01-20" ...
$ USER_Year : num 2022 2021 2022 2022 2022 ...
$ USER_Month: num 1 1 1 1 1 1 1 1 1 1
$ USER_Day : num 4 6 19 20 24 27 28 19 31 31
$ USER_Year1: chr "2022" "2021" "2022" "2022" ...
- attr(*, "sfc_columns")= chr [1:2] "x" "y"
我怀疑您只是没有加载jQuery,因为代码看起来还不错。
尝试在开始时添加。
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
我以为在您的情况下,我认为当使用板API时,您的目标可能可以使用。
解决方法1:
此解决方法使用板API。
用法:
1。准备Google电子表格。
-
请创建一个新的Google电子表格。
-
来自
示例。我有一个命名的范围苹果(地址为“ Sheet10!b2:b”),该苹果用于大量板单元的数据验证。可以更改苹果的数据范围(在脚本中),例如“ Sheet10!d2:d”。
,请插入“ Sheet10”的表格,然后将样本值放在单元格“ B2:B”和“ D2:D”。 - 在
2。示例脚本。
请将以下脚本复制到电子表格的脚本编辑器并保存脚本。并且,请在高级Google Services 启用Sheable Sheable API 。
function myFunction() {
const namedRangeName = "Apple"; // Please set the name of the named range.
const ss = SpreadsheetApp.getActiveSpreadsheet();
const sheet = ss.getSheetByName("Sheet10");
const requests = [{ updateCells: { range: { sheetId: sheet.getSheetId(), startRowIndex: 0, endRowIndex: 1, startColumnIndex: 0, endColumnIndex: 1 }, rows: [{ values: [{ dataValidation: { condition: { values: [{ userEnteredValue: "=" + namedRangeName }], type: "ONE_OF_RANGE" }, showCustomUi: true } }] }], fields: "dataValidation" } }];
Sheets.Spreadsheets.batchUpdate({ requests }, ss.getId());
}
- 在此请求中,命名范围的名称直接放在
userEnteredValue
中。
3。测试。
将此脚本运行到上述样本电子表格时,将获得以下结果。
当看到此演示时,首先,您可以看到具有“ b1:b1000”单元格的“苹果”范围。运行脚本后,将数据验证放在带有“ Apple”范围的单元格“ A1”中。在这种情况下,数据验证的值表示“ B1:B1000”。当名称范围“ Apple”范围从“ B1:B1000”更改为“ D1:D1000”,并且确认了“ A1”的数据验证,发现值从“ B1:B1000”更改为“ D1” :D1000“。
解决方法2:
此解决方法使用Google电子表格服务(电子表格)。在当前阶段,Google电子表格服务(电子表格)似乎无法直接实现您的目标。在评论中的讨论中已经提到了这一点, themaster的答案。当您想实现这一目标时,如何使用onChange检查命名范围的范围是否会像以下可进行2一样更改?
用法:
1。准备Google电子表格。
-
请创建一个新的Google电子表格。
-
来自
示例。我有一个命名的范围苹果(地址为“ Sheet10!b2:b”),该苹果用于大量板单元的数据验证。可以更改苹果的数据范围(在脚本中),例如“ Sheet10!d2:d”。
,请插入“ Sheet10”的表格,然后将样本值放在单元格“ B2:B”和“ D2:D”。 - 在
2。示例脚本。
请将以下脚本复制到电子表格的脚本编辑器并保存脚本。和,请安装on Change onChange on Change to to function onCode> onCode> on Code> onChange
。
首先,请运行 CreateAtavalidation
。这样,将数据验证放在“ Sheet10”的单元格“ A1”中。在这种情况下,设定范围是从命名范围“ Apple”中检索的范围。因此,在这种情况下,范围为 Sheet10!b2:b1000
。
在下一步中,请更改名称范围的范围从 Sheet11!B2:B1000
到Sheet10!D2:D1000 。这样,
onChange`函数将通过安装的Onchange触发器自动运行。这样,更新了“ A2”的数据验证。这样,数据验证的值将更改。
const namedRangeName = "Apple"; // Please set the name of the named range.
const datavalidationCell = "Sheet10!A2"; // As a sample. data validation is put to this cell.
function onChange(e) {
if (e.changeType != "OTHER") return;
const range = e.source.getRangeByName(namedRangeName);
const a1Notation = `'${range.getSheet().getSheetName()}'!${range.getA1Notation()}`;
const prop = PropertiesService.getScriptProperties();
const previousRange = prop.getProperty("previousRange");
if (previousRange != a1Notation) {
const rule = SpreadsheetApp.newDataValidation().requireValueInRange(e.source.getRangeByName(namedRangeName)).setAllowInvalid(false).build();
e.source.getRange(datavalidationCell).setDataValidation(rule);
}
prop.setProperty("previousRange", a1Notation);
}
// First, please run this function.
function createDataValidation() {
const ss = SpreadsheetApp.getActiveSpreadsheet();
const rule = SpreadsheetApp.newDataValidation().requireValueInRange(ss.getRangeByName(namedRangeName)).setAllowInvalid(false).build();
ss.getRange(datavalidationCell).setDataValidation(rule);
const prop = PropertiesService.getScriptProperties();
const range = ss.getRangeByName(namedRangeName);
const a1Notation = `'${range.getSheet().getSheetName()}'!${range.getA1Notation()}`;
prop.setProperty("previousRange", a1Notation);
}
参考:
- 方法:
- =“ https://develvemers.google.com/sheets/api/reference/Rest/Rest/v4/spreadsheets/request#updatecellsrequest
- ” .google.com/sheets/api/reference/rest/v4/spreadsheets/cells#DataValidationRule" rel="nofollow noreferrer">DataValidationRule
$ _ POST
设置变量时,您会缺少数组键。[]
。这将字符串放在数组中,但是变量的值只是字符串。不要那样做。$_POST
.[]
around the strings. That puts the string in an array, but the values of the variables are just strings. Don't do that.自动获取错误消息而不是结果